Using SevenZipSharp to compress in multi volumes?

.net, c#, compression, sevenzipsharp, vb.net

Solution

On your `Compressor` object, set `VolumeSize` to the desired size of the output file(s) in bytes. Using the sample code below, with the source directory full of about 72MB of mp3 files, the compressor created 8 output files named zipped.7z.001, zipped.7z.002, etc.

Looking at the current source for the `SevenZipExtractor` class, it looks like the multi-volume compression is only available if you are using `OutArchiveFormat.SevenZip` as your `ArchiveFormat`.

string dll = @"C:\Users\WarrenG\Desktop\7z.dll";
string source = @"C:\Users\WarrenG\Desktop\source";
string output = @"C:\Users\WarrenG\Desktop\output\zipped.7z";

SevenZipExtractor.SetLibraryPath(dll);
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.ArchiveFormat = OutArchiveFormat.SevenZip;
compressor.CompressionMode = CompressionMode.Create;
compressor.TempFolderPath = System.IO.Path.GetTempPath();
compressor.VolumeSize = 10000000;   // output file size in bytes
compressor.CompressDirectory(source, output);

Problem

I want to use SevenZipsharp to compress a file in volumes, for example to compress a file of 100 mb into 10 files of 10 mb each. We can do the same using 7zip.exe -volume parameter so... For example, when I compress in multi volumes using 7Zip I get these structure of files: ``` File.7z.001 File.7z.002 File.7z.003 etc... ``` The files are not independient, Are not a amount of 7zip files with the same size, is one compressed file in various volumes, I mean to extract the entire content we need the first file "File.7z.001" I want to make the same thing using SevenZipSharp (if possible). I've made this snippet in vb.net (but no matter if the answer are in C# code), I need to implement the multi-volume option, I need help: ``` Imports SevenZip Dim dll As String = "7z.dll" Private Function SevenZipSharp_Compress(ByVal Input_DirOrFile As String, _ Optional ByVal OutputFileName As String = Nothing, _ Optional ByVal Format As OutArchiveFormat = OutArchiveFormat.SevenZip, _ Optional ByVal CompressionMode As CompressionMode = CompressionMode.Create, _ Optional ByVal CompressionMethod As CompressionMethod = CompressionMethod.Lzma, _ Optional ByVal CompressionLevel As CompressionLevel = CompressionLevel.Normal, _ Optional ByVal Password As String = Nothing) As Boolean Try ' Set library path SevenZipExtractor.SetLibraryPath(dll) ' Create compressor and specify the file or folder to compress Dim Compressor As SevenZipCompressor = New SevenZipCompressor() ' Set compression parameters Compressor.CompressionLevel = CompressionLevel ' Archiving compression level. Compressor.CompressionMethod = CompressionMethod ' Append files to compressed file or overwrite the compressed file. Compressor.ArchiveFormat = Format ' Compression file format Compressor.CompressionMode = CompressionMode ' Compression mode Compressor.DirectoryStructure = True ' Preserve the directory structure. Compressor.IncludeEmptyDirectories = True ' Include empty directories to archives. Compressor.ScanOnlyWritable = False ' Compress files only open for writing. Compressor.EncryptHeaders = False ' Encrypt 7-Zip archive headers Compressor.TempFolderPath = System.IO.Path.GetTempPath() ' Temporary folder path Compressor.FastCompression = False ' Compress as fast as possible, without calling events. Compressor.PreserveDirectoryRoot = True ' Preserve the directory root for CompressDirectory. Compressor.ZipEncryptionMethod = ZipEncryptionMethod.ZipCrypto ' Encryption method for zip archives. Compressor.DefaultItemName = "File.7z" ' Item name used when an item to be compressed has no name, for example, when you compress a MemoryStream instance ' Get File extension Dim CompressedFileExtension As String = Nothing Select Case Compressor.ArchiveFormat Case OutArchiveFormat.SevenZip : CompressedFileExtension = ".7z" Case OutArchiveFormat.BZip2 : CompressedFileExtension = ".bz" Case OutArchiveFormat.GZip : CompressedFileExtension = ".gzip" Case OutArchiveFormat.Tar : CompressedFileExtension = ".tar" Case OutArchiveFormat.XZ : CompressedFileExtension = ".xz" Case OutArchiveFormat.Zip : CompressedFileExtension = ".zip" End Select ' Add Progress Handler 'AddHandler Compressor.Compressing, AddressOf SevenZipSharp_Compress_Progress ' Removes the end slash ("\") if given for a directory If Input_DirOrFile.EndsWith("\") Then Input_DirOrFile = Input_DirOrFile.Substring(0, Input_DirOrFile.Length - 1) ' Generate the OutputFileName if any is given. If OutputFileName Is Nothing Then _ OutputFileName = (My.Computer.FileSystem.GetFileInfo(Input_DirOrFile).DirectoryName & "\" & (Input_DirOrFile.Split("\").Last) & CompressedFileExtension).Replace("\\", "\") ' Check if given argument is Dir or File ...then start the compression If IO.Directory.Exists(Input_DirOrFile) Then ' Is a Dir If Not Password Is Nothing Then Compressor.CompressDirectory(Input_DirOrFile, OutputFileName, True, Password) Else Compressor.CompressDirectory(Input_DirOrFile, OutputFileName, True) End If ElseIf IO.File.Exists(Input_DirOrFile) Then ' Is a File If Not Password Is Nothing Then Compressor.CompressFilesEncrypted(OutputFileName, Password, Input_DirOrFile) Else Compressor.CompressFiles(OutputFileName, Input_DirOrFile) End If End If Catch ex As Exception 'Return False ' File not compressed Throw New Exception(ex.Message) End Try Return True ' File compressed End Function ``` Usage of the snippet: ``` SevenZipSharp_Compress("C:\File or folder", _ "Optional: Output dir", _ OutArchiveFormat.SevenZip, _ CompressionMode.Create, _ CompressionMethod.Lzma, _ CompressionLevel.Ultra, _ "Optional: Password") ```

Original source