[英]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.