Skip to content
/ GZip Public

Программа позволяет проводить многопоточное сжатие и распаковку больших файлов при помощи GZipStream. / Multithreaded compressing and decompressing of large text files with GZipStream

Notifications You must be signed in to change notification settings

Mikezar/GZip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задача


Написать программу на C#, предназначенную для сжатия и расжатия файлов с помощью System.IO.Compression.GzipStream.

Параметры программы, имена исходного и результирующего файлов задаются в командной строке следующим образом:

• для архивации: GZipTest.exe compress [имя исходного файла] [имя архива] • для разархивации: GZipTest.exe decompress [имя архива] [имя распакованного файла]

В случае успеха программа возвращает 0, при ошибке 1.

Программа должна эффективно распараллеливать и синхронизировать задачи в многопроцессорной среде и уметь обрабатывать файлы, размер которых превышает объем доступной оперативной памяти.


Реализация


Для успешной реализации данной задачи было принято решение использовать паттерн Producer/Consumer.

Программа принимает массив строк через командную строку, либо консоль Visual Studio. Проводит валидацию данных и передает параметры в соответствующий метод на сжатие или разжатие файла. Сжатие и разжатие происходит в многопоточной среде, где количество потоков соответствует количеству ядер. При сжатии считывается полная длина файла, в процессе файл разбивается на блоки одинакового размера, которые передаются в очередь на дальнейшее сжатие, параллельно идентифицируя уникальным id эти самые блоки. Метод на сжатие извлекает из очереди блок байтов и проводит их компрессию, далее записывает их в другую очередь на запись в файл. Перед непосредственной записью сжатых данных получаем и записываем длину сжатого блока. Если этого не сделать, то мы не сможем разжимать файлы т.к по факту программа будет брать блоки случайной длины и передавать их на декомпрессию.

При разжатии происходит чтение первых 8 байт, посредством которых мы узнаем сколько нужно ещё прочитать до конца блока. Блок считывается и передается в декомпрессию. Результат пишется в выходной файл. Итерация повторяется.

Для удобства пользователя процесс сжатия и разжатия сопровождается Progress Bar'ом, который показывает прогресс, а также количество обработанных байтов.

При нажатии комбинации клавиш CTRL + C происходит корректный выход.

About

Программа позволяет проводить многопоточное сжатие и распаковку больших файлов при помощи GZipStream. / Multithreaded compressing and decompressing of large text files with GZipStream

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages