简体   繁体   English

使用SevenZipSharp压缩多卷?

[英]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. 我想使用SevenZipsharp压缩卷中的文件,例如将100 mb的文件压缩为10个10 mb的文件。 We can do the same using 7zip.exe -volume parameter so... 我们可以使用7zip.exe -volume参数来做同样的事情......

For example, when I compress in multi volumes using 7Zip I get these structure of files: 例如,当我使用7Zip压缩多卷时,我得到这些文件结构:

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" 文件不是独立的,不是一个大小相同的7zip文件,是一个不同卷的压缩文件,我的意思是提取我们需要的第一个文件“File.7z.001”的整个内容

I want to make the same thing using SevenZipSharp (if possible). 我想使用SevenZipSharp做同样的事情(如果可能的话)。

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: 我在vb.net中创建了这个片段(但不管答案是否在C#代码中),我需要实现多卷选项,我需要帮助:

   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")

On your Compressor object, set VolumeSize to the desired size of the output file(s) in bytes. Compressor对象上,将VolumeSize设置为所需的输出文件大小(以字节为单位)。 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. 使用下面的示例代码,源目录充满了大约72MB的mp3文件,压缩器创建了8个名为zipped.7z.001,zipped.7z.002等的输出文件。

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 . 查看SevenZipExtractor类的当前源代码,看起来只有在使用OutArchiveFormat.SevenZip作为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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM