Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using SevenZipSharp to compress in multi volumes?

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")
like image 237
ElektroStudios Avatar asked Apr 15 '13 13:04

ElektroStudios


1 Answers

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);
like image 50
WarrenG Avatar answered Oct 25 '22 17:10

WarrenG