Написать программу на C#, предназначенную для сжатия и расжатия файлов с помощью System.IO.Compression.GzipStream.
Параметры программы, имена исходного и результирующего файлов задаются в командной строке следующим образом:
• для архивации: GZipTest.exe compress [имя исходного файла] [имя архива] • для разархивации: GZipTest.exe decompress [имя архива] [имя распакованного файла]
В случае успеха программа возвращает 0, при ошибке 1.
Программа должна эффективно распараллеливать и синхронизировать задачи в многопроцессорной среде и уметь обрабатывать файлы, размер которых превышает объем доступной оперативной памяти.
Для успешной реализации данной задачи было принято решение использовать паттерн Producer/Consumer.
Программа принимает массив строк через командную строку, либо консоль Visual Studio. Проводит валидацию данных и передает параметры в соответствующий метод на сжатие или разжатие файла. Сжатие и разжатие происходит в многопоточной среде, где количество потоков соответствует количеству ядер. При сжатии считывается полная длина файла, в процессе файл разбивается на блоки одинакового размера, которые передаются в очередь на дальнейшее сжатие, параллельно идентифицируя уникальным id эти самые блоки. Метод на сжатие извлекает из очереди блок байтов и проводит их компрессию, далее записывает их в другую очередь на запись в файл. Перед непосредственной записью сжатых данных получаем и записываем длину сжатого блока. Если этого не сделать, то мы не сможем разжимать файлы т.к по факту программа будет брать блоки случайной длины и передавать их на декомпрессию.
При разжатии происходит чтение первых 8 байт, посредством которых мы узнаем сколько нужно ещё прочитать до конца блока. Блок считывается и передается в декомпрессию. Результат пишется в выходной файл. Итерация повторяется.
Для удобства пользователя процесс сжатия и разжатия сопровождается Progress Bar'ом, который показывает прогресс, а также количество обработанных байтов.
При нажатии комбинации клавиш CTRL + C происходит корректный выход.