Консольное приложение на C# для поблочного сжатия и распаковки файлов с помощью System.IO.Compression.GzipStream.
Для сжатия исходный файл делится на блоки одинакового размера (константа BufferSize
).
Каждый блок сжимается и записывается в выходной файл независимо от остальных блоков.
Программа эффективно распараллеливает и синхронизирует обработку блоков в многопроцессорной среде и умеет обрабатывать файлы, размер которых превышает объем доступной оперативной памяти.
Примечание: формат архива приближен к формату GZIP (https://tools.ietf.org/html/rfc1952#page-5), т.е. блоки GZIP записываются последовательно. Такой формат удается разархивировать, однако он не позволяет реализовать эффективную параллельную распаковку, так как размер блока неизвестен. И нет гарантии, что очередной блок поместится в оперативную память, но это можно побороть, если необходимо.
При работе с потоками используются только базовые классы и объекты синхронизации:
- Thread
- Manual/AutoResetEvent
- Monitor, и оператор lock.
- SemaphoreSlim
Управление программой ожидается в формате:
GZipTest.exe compress/decompress [имя исходного файла] [имя результирующего файла]
Однако так как это .net core
, то пока приложение не опубликовано, то синтаксис немного отличается:
dotnet GZipTest.dll compress/decompress [имя исходного файла] [имя результирующего файла]
- Unit тесты
- Возможность распаковки файлов любого размера.
Желательно бы переписать SplitToChunk на фабрику потоков, и анализировать начало нового фрагмента при вызове метода Stream.Read.