Распаковка с использованием 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();
}