GZipDotNet.exe # Программа предназначена для сжатия и распаковки файлов с помощью System.IO.Compression.GzipStream. # Имена исходного и результирующего файлов задаются в командной строке. # Разработчик: Павел Паргачёв # Дата: 19 мая 2013 Формат данных: Программа использует класс System.IO.Compression.GzipStream, результат которого может быть распакован с помощью сторонних zip-архиваторов. Однако по условию задачи необходимо было реализовать многопоточное сжатие файлов. Класс System.IO.Compression.GzipStream не позволяет производить многопоточное сжатие, поэтому программа выполняет сжатие в своем собственном формате: в первых байтах сжатого файла записывает заголовок "GZipDotNet", затем следуют сжатые блоки данных, каждый из которых представляет небольшой блок данных сжатый GzipStream перед таким блоком записывается его размер в байтах. За счёт разделения на блоки появляется возможность одновременного сжатия в нескольких потоках. Основная нагрузка по сжатию и распаковке файлов положена в класс GZipDotNetCompressStream. Класс по функциональности аналогичен System.IO.Compression.GzipStream. Таким образом для сжатия данных с помощью класса GZipDotNetCompressStream необходимо создать экземпляр этого класса, передав в качестве аргументов в конструктор поток в который будет записывать результат и режим работы Compression. Для распаковки данных необходимо создать экземпляр этого класса, передав поток, из которого будет производится чтение сжатых данных и режим работы Decompression. Запуск приложения: После запуска программа анализирует аргументы. Открывает файл, переданный как исходный и по заголовку файла определяет режим работы "Сжатие" и "Распаковка". Если переданы некорректные аргументы программы выводит в консоль сообщение с синтаксисом использования: Usage: GZipDotNet.exe srcFileName [dstFileName] Сжатие файла: При поступлении данных для сжатия программа разделяет их на небольшие блоки. Затем эти блоки сжимаются набором thread-ов. При появлении блоков сжатых данных они записываются в выходной поток в порядке считывания из входного потока. Thread-ы для обработки небольших блоков данных создаются и запускаются при создании объекта класса GZipDotNetCompressStream. Количество thread-ов определяется по количеству ядер процессора. Дополнительно перед выходным файловым потоком создан BufferedStream для исключения частого переключения между чтением и записью на жесткий диск. Распаковка файла: Проходит в обратном порядке. Внешняя программа запрашивается распакованные данные из потока GZipDotNetCompressStream. Для удовлетворения этого запроса поток запрашивает данные из входного потока, разделяет их на блоки. Распаковка производится набором thread-ов созданным во время инициализации GZipDotNetCompressStream. При появлении распакованных блоков данных они собираются в буфер, переданный внешней программой для чтения распакованных данных.