2013-04-15 9 views
5

Desidero utilizzare SevenZipsharp per comprimere un file in volumi, ad esempio per comprimere un file di 100 mb in 10 file di 10 mb ciascuno. Siamo in grado di fare lo stesso utilizzando 7zip.exe parametro -volume così ...Utilizzo di SevenZipSharp per comprimere in più volumi?

Per esempio, quando ho comprimere in multi volumi utilizzando 7Zip ottengo questi struttura dei file:

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

I file non sono independient , Non sono una quantità di file 7zip con le stesse dimensioni, è un file compresso in vari volumi, voglio dire che per estrarre l'intero contenuto abbiamo bisogno del primo file "File.7z.001"

Voglio fare lo stesso cosa usando SevenZipSharp (se possibile).

Ho fatto questo frammento in vb.net (ma non importa se la risposta sono in codice C#), ho bisogno di implementare l'opzione più volumi, ho bisogno di aiuto:

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 del frammento:

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

risposta

11

Sul Compressor oggetto, impostare VolumeSize alla dimensione desiderata del file di output (s) in byte. Utilizzando il codice di esempio qui sotto, con la directory sorgente piena di circa 72 MB di file mp3, il compressore ha creato 8 file di output denominati zipped.7z.001, zipped.7z.002, ecc.

Guardando la sorgente corrente per Classe SevenZipExtractor, sembra che la compressione multi-volume sia disponibile solo se si utilizza OutArchiveFormat.SevenZip come 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

Ho usato ** ** VolumeSize proprietà prima di chiedere, ma per qualche strana ragione non ha funzionato, forse il motivo è che quello che hai detto, è avaliable solo per il formato 7zip, almeno ora funziona con 7zip formato, grazie! – ElektroStudios

Problemi correlati