2013-04-15 38 views
5

Tôi muốn sử dụng SevenZipsharp để nén tệp theo số lượng, ví dụ nén một tệp 100 mb thành 10 tệp có dung lượng 10 mb mỗi tệp. Chúng ta có thể làm như vậy bằng 7zip.exe tham số -volume như vậy ...Sử dụng SevenZipSharp để nén trong nhiều ổ đĩa?

Ví dụ, khi tôi nén trong tập đa bằng 7Zip tôi nhận được những cấu trúc của tập tin:

File.7z.001 
File.7z.002 
File.7z.003 
etc... 

Các tập tin không independient , Không phải là số lượng tệp 7zip có cùng kích thước, là một tệp nén với số lượng khác nhau, tôi muốn trích xuất toàn bộ nội dung chúng tôi cần tệp đầu tiên "File.7z.001"

Tôi muốn thực hiện tương tự điều sử dụng SevenZipSharp (nếu có thể).

Tôi đã thực hiện đoạn mã này trong vb.net (nhưng không có vấn đề nếu câu trả lời là trong C# code), tôi cần phải thực hiện các tùy chọn đa khối lượng, tôi cần sự giúp đỡ:

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 

Cách sử dụng của đoạn:

SevenZipSharp_Compress("C:\File or folder", _ 
          "Optional: Output dir", _ 
          OutArchiveFormat.SevenZip, _ 
          CompressionMode.Create, _ 
          CompressionMethod.Lzma, _ 
          CompressionLevel.Ultra, _ 
          "Optional: Password") 

Trả lời

11

Mở đối tượng Compressor của bạn, thiết lập VolumeSize đến kích thước mong muốn của tập tin đầu ra (s) tính bằng byte. Sử dụng mã mẫu bên dưới, với thư mục nguồn đầy đủ khoảng 72MB tệp mp3, máy nén đã tạo 8 tệp đầu ra có tên là zip7z.001, zipped.7z.002, v.v.

Nhìn vào nguồn hiện tại cho SevenZipExtractor lớp học, có vẻ như nén nhiều tập chỉ khả dụng nếu bạn đang sử dụng OutArchiveFormat.SevenZip làm 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); 
+0

Tôi đã sử dụng thuộc tính ** VolumeSize ** trước khi hỏi nhưng vì lý do lạ không hoạt động, có thể lý do là những gì bạn nói, chỉ có sẵn cho định dạng 7zip, ít nhất giờ đây hoạt động với 7zip định dạng, thankyou! – ElektroStudios