Потоки (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

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


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

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

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