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