Потоки (threads) и сжатие файлов - C#

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

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

Всем привет! Я недавно изучаю C#, пытаюсь самостоятельно выполнять практические задания. Есть задание, общая суть такая: "Написать архиватор используя System.IO.Compression.GzipStream. Распараллеливать и синхронно обрабатывать файлы блоками в многопроцессорной среде (и архивировать файлы превышающие объем ОЗУ). Использовать Thread-ы." Архивирующий код я написал, работает. А вот как прикрутить треды не очень понял. Как они работают я примерно представляю, разберусь. А как разделить файл на части во время работы программы (это ведь требуется?)? Что читать, куда смотреть? Пока только стандартными библиотеками. Что я написал (по шаблону с MSN):
Листинг программы
  1. public static void Compress(FileInfo fileSelected)
  2. {
  3. // переменные, объявленные в скобках инструкции using(тут) удаляются в конце инструкции
  4. using (FileStream originalFileStream = fileSelected.OpenRead()) // создаем FileStream исходного файла для чтения
  5. {
  6. if ((File.GetAttributes(fileSelected.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden)
  7. {
  8. using (FileStream compressedFileStream = File.Create(resultFilePath)) // создаем FileStream для нового файла
  9. {
  10. using (GZipStream compressionStream = new GZipStream(compressedFileStream
  11. , CompressionMode.Compress)) // создаем GZipStream для сжатия
  12. {
  13. originalFileStream.CopyTo(compressionStream); // копирование со сжатием
  14. } // GZipStream удаляется
  15. } // FileStream нового файла удаляется
  16. FileInfo info = new FileInfo(resultFilePath);
  17. Console.WriteLine("Файл {0} сжат из {1} байт до {2} байт.",
  18. fileSelected.Name, fileSelected.Length.ToString(), info.Length.ToString());
  19. }
  20. } // FileStream исходного файла удаляется
  21. } // конец метода сжатия Compress
  22. public static void Decompress(FileInfo fileToDecompress)
  23. {
  24. using (FileStream originalFileStream = fileToDecompress.OpenRead()) // создаем FileStream исходного файла
  25. {
  26. using (FileStream decompressedFileStream = File.Create(resultFilePath)) // создаем FileStream нового файла
  27. {
  28. using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) // создаем GZipStream для распаковки
  29. {
  30. decompressionStream.CopyTo(decompressedFileStream);
  31. Console.WriteLine("Расжат файл: {0}", fileToDecompress.Name);
  32. } // удаляется GZipStream
  33. } // удаляется FileStream нового файла
  34. } // удаляется FileStream исходного файла
  35. } // конец Decompress

Решение задачи: «Потоки (threads) и сжатие файлов»

textual
Листинг программы
  1.         public static void Compress(FileInfo fileSelected)
  2.         {
  3.             // переменные, объявленные в скобках инструкции using(тут) удаляются в конце инструкции
  4.             using (FileStream originalFileStream = fileSelected.OpenRead()) // создаем FileStream исходного файла для чтения
  5.             {
  6.                 if ((File.GetAttributes(fileSelected.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden)
  7.                 {
  8.                     using (FileStream compressedFileStream = File.Create(resultFilePath)) // создаем FileStream для нового файла
  9.                     {
  10.                         using (GZipStream compressionStream = new GZipStream(compressedFileStream
  11.                                     , CompressionMode.Compress)) // создаем GZipStream для сжатия
  12.                         {
  13.                             while (true)
  14.                             {
  15.                                 ramFree = ramCounter.NextValue();
  16.                                 Int32 blockSize = (Int32) ramFree * 1024 / 2 / processorCount;
  17.                                 blockSize = (Int32) originalFileStream.Length;
  18.  
  19.                                 //object locker = new Object();
  20.                                 byte[] buffer = new byte[blockSize];
  21.                                 Int32 size = originalFileStream.Read(buffer, 0, blockSize);
  22.  
  23.                                 if (size != 0)
  24.                                 {
  25.                                     blocksProcessed++; // счет кол-ва обработанных блоков
  26.                                     compressionStream.Write(buffer, 0, blockSize);
  27.                                 }
  28.                                 else
  29.                                     break;
  30.                             }
  31.                         } // GZipStream удаляется
  32.                     }           // FileStream нового файла удаляется
  33.                     FileInfo info = new FileInfo(resultFilePath);
  34.                     Console.WriteLine("Файл {0} сжат из {1} байт до {2} байт.",
  35.                     fileSelected.Name, fileSelected.Length.ToString(), info.Length.ToString());
  36.                 }
  37.             }   // FileStream исходного файла удаляется
  38.         } // конец метода сжатия Compress

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


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

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

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут