Потоки (threads) и сжатие файлов - C#
Формулировка задачи:
Всем привет! Я недавно изучаю C#, пытаюсь самостоятельно выполнять практические задания.
Есть задание, общая суть такая: "Написать архиватор используя System.IO.Compression.GzipStream. Распараллеливать и синхронно обрабатывать файлы блоками в многопроцессорной среде (и архивировать файлы превышающие объем ОЗУ). Использовать Thread-ы."
Архивирующий код я написал, работает. А вот как прикрутить треды не очень понял. Как они работают я примерно представляю, разберусь. А как разделить файл на части во время работы программы (это ведь требуется?)? Что читать, куда смотреть?
Пока только стандартными библиотеками.
Что я написал (по шаблону с MSN):
public static void Compress(FileInfo fileSelected)
{
// переменные, объявленные в скобках инструкции using(тут) удаляются в конце инструкции
using (FileStream originalFileStream = fileSelected.OpenRead()) // создаем FileStream исходного файла для чтения
{
if ((File.GetAttributes(fileSelected.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
using (FileStream compressedFileStream = File.Create(resultFilePath)) // создаем FileStream для нового файла
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream
, CompressionMode.Compress)) // создаем GZipStream для сжатия
{
originalFileStream.CopyTo(compressionStream); // копирование со сжатием
} // GZipStream удаляется
} // FileStream нового файла удаляется
FileInfo info = new FileInfo(resultFilePath);
Console.WriteLine("Файл {0} сжат из {1} байт до {2} байт.",
fileSelected.Name, fileSelected.Length.ToString(), info.Length.ToString());
}
} // FileStream исходного файла удаляется
} // конец метода сжатия Compress
public static void Decompress(FileInfo fileToDecompress)
{
using (FileStream originalFileStream = fileToDecompress.OpenRead()) // создаем FileStream исходного файла
{
using (FileStream decompressedFileStream = File.Create(resultFilePath)) // создаем FileStream нового файла
{
using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) // создаем GZipStream для распаковки
{
decompressionStream.CopyTo(decompressedFileStream);
Console.WriteLine("Расжат файл: {0}", fileToDecompress.Name);
} // удаляется GZipStream
} // удаляется FileStream нового файла
} // удаляется FileStream исходного файла
} // конец DecompressРешение задачи: «Потоки (threads) и сжатие файлов»
textual
Листинг программы
public static void Compress(FileInfo fileSelected)
{
// переменные, объявленные в скобках инструкции using(тут) удаляются в конце инструкции
using (FileStream originalFileStream = fileSelected.OpenRead()) // создаем FileStream исходного файла для чтения
{
if ((File.GetAttributes(fileSelected.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
using (FileStream compressedFileStream = File.Create(resultFilePath)) // создаем FileStream для нового файла
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream
, CompressionMode.Compress)) // создаем GZipStream для сжатия
{
while (true)
{
ramFree = ramCounter.NextValue();
Int32 blockSize = (Int32) ramFree * 1024 / 2 / processorCount;
blockSize = (Int32) originalFileStream.Length;
//object locker = new Object();
byte[] buffer = new byte[blockSize];
Int32 size = originalFileStream.Read(buffer, 0, blockSize);
if (size != 0)
{
blocksProcessed++; // счет кол-ва обработанных блоков
compressionStream.Write(buffer, 0, blockSize);
}
else
break;
}
} // GZipStream удаляется
} // FileStream нового файла удаляется
FileInfo info = new FileInfo(resultFilePath);
Console.WriteLine("Файл {0} сжат из {1} байт до {2} байт.",
fileSelected.Name, fileSelected.Length.ToString(), info.Length.ToString());
}
} // FileStream исходного файла удаляется
} // конец метода сжатия Compress