Распаковка с использованием GZipStream - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Поставлена задача - используя библиотеку GZipStream, осуществить Multi-Thread упаковку/распаковку. Задача тут описывалась не раз, и не только на этом форуме, и не только на русском. Попытался слепить все прочитанное на форумах (в т.ч. у Микрософта), и вышло нечто такое:
 public static void Decompress(string inFileName)
        {
            using (FileStream inFile = new FileStream(inFileName, FileMode.Open, FileAccess.Read))
            {
                using (GZipStream decomp = new GZipStream(inFile, CompressionMode.Decompress))
                {
                    string dir = Path.GetDirectoryName(inFileName);
                    string decompressionFileName = dir + Path.GetFileNameWithoutExtension(inFileName) + "_decompressed";
                    Console.Write("processing...");
                    int BufferSize = 8192;
                    using (FileStream outStream = new FileStream(inFileName, FileMode.Create, FileAccess.Write))
                    {
                        int read = 0;
                        byte[] buffer = new byte[BufferSize];
                        while ((read = decomp.Read(buffer, 0, BufferSize)) != 0)
                        {
                            outStream.Write(buffer, 0, read);
                        }
                        outStream.Close();
                    }
                    decomp.Close();
                }
                inFile.Close();
            }
        }
Выпадает ошибка - архив занят. пробовал разные файлы. Может, свежим взглядом (или кто-то решил уже) кто-то найдет глюк, и направит в сторону решения многопоточности ?
UPDATE Ошибка найдена
inFileName
надо заменить на
string decompressionFileName
Вопрос многопоточности открыт.
Следующая загадка - запаковку я заимствовал тут, на форуме, и выходит так, что размеру блока запаковки равен максимальный размер распакованного по моему способу файлу... Буду разбираться...

Решение задачи: «Распаковка с использованием GZipStream»

textual
Листинг программы
for (j = 0; (j < multithread-1) && ((inFile.Length - inFile.Position) > BufferSize); j++)
                                {                                 
                                    thread[j] = new Thread(()=>
                                    {
                                        Console.Write("- {0} -", j);
                                        read[j] = inFile.Read(buffer, 0, BufferSize);
                                        inGZip.Write(buffer, 0, read[j]);
                                    });                                  
                                    thread[j].Start();
                               //     Thread.Sleep(500);
 
                                    //       thread[j].Join();
 
                                    thread_[j] = new Thread(() =>
                                    {
                                     //       inGZip.Write(buffer, 0, read[j]);
                                            Console.Write("|");
                                          //  Thread.Sleep(100);
                                    });
                                //    thread_[j].Start();
                               //     thread_[j].Join();
 
                                }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5