Потоки (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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д