#c_sharp #zip
Это продолжение предыдущего вопроса, где я пытаюсь для создания zip-файлов использовать open source библиотеку SharpZipLib. Возник вопрос организации архивов в виде томов определенного размера (например, для записи архивов >4Гб на FAT32 диск). Может кто-то из тех, кто использовал данную библиотеку, подсказать вариант выполнения? З.Ы. Документация по либе крайне скудная и плохо организована, поэтому сам найти способ не смог :(
Ответы
Ответ 1
Попробуйте dotNetZip - он позволяет решить вашу задачу. DotNetZip example: int SegmentsCreated ; using (ZipFile zip = new ZipFile()) { zip.UseUnicode= true; // utf-8 zip.AddDirectory(@"MyDocuments\ProjectX"); zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ; zip.MaxOutputSegmentSize = 100*1024 ; // 100k segments zip.Save("MyFiles.zip"); SegmentsCreated = zip.NumberOfSegmentsForMostRecentSave ; }Ответ 2
Можете простым кодом вроде этого поделить уже готовый zip-файл на части: public static void SplitFile(string source, long partSize, string destinationFormat, int firstFileNumber = 0) { var sourceStream = File.OpenRead(source); var buffer = new byte[80*1024]; var position = sourceStream.Position; var fileNumber = firstFileNumber; while (position < sourceStream.Length) { var filename = String.Format(destinationFormat, fileNumber); using(var destinationStream = File.Create(filename)) { var count = 0; do { count = sourceStream.Read(buffer, 0, (int)Math.Min(buffer.LongLength, partSize - destinationStream.Position)); destinationStream.Write(buffer, 0, count); position += count; } while (count > 0); } fileNumber++; } } вызов: SplitFile( source: @"C:\test\test.zip", destinationFormat: @"C:\test\test.z{0:D2}", partSize: 100000*1024 ); Если хотите сразу писать в несколько файлов, то конструктору ZipFile можно подавать в качестве аргумента экземпляры Stream/Filestream. При желании, можно сделать наследника для одного из этих классов, который и будет автоматически писать в несколько файлов. Это не сложно, просто кода нужно относительно много, т.к. требуется что бы поток был Seekable и Readable(не смотря на то, что мы собираемся только писать в поток)
Комментариев нет:
Отправить комментарий