2013-08-09 17 views

cevap

5

SevenZipCompressor sınıfı, CompressFileDictionary() adlı bir yöntem sağlar. Yöntem aşırı yüklemelerinden biri, bir dosya sözlüğü ve dosya akışı bekler. Dosya sözlüğü sıradan bir .Net Dictionary<string,string>. Sözlüğün anahtarı, dosyanın arşivdeki 'daki adı (veya göreli yolu) olup, sözlüğün değeri dosya sistemindeki dosyanın yolu.

Sözlüğün anahtarı, 7z arşivindeki yapıyı kontrol etmenizi sağlar. Örneğin olman gereken üç klasör

c:\temp\testdir1 
      |- file1.txt 
      |- file2.txt 
c:\temp\testdir2 
      |- file1.txt 
c:\temp2\test 
      |- file3.txt 

ve arşivde çıkan yapıyı sıkıştırmak istiyorsanız

testdir1 
     |- file1.txt 
     |- file2.txt 
testdir2 
     |- file1.txt 
    test 
     |-file3.txt 

sonra sadece şu şekilde dictonary dosya eklemek:

Dictionary<string, string> filesDic = new Dictionary<string, string>(); 

filesDic.Add(@"testdir1\file1.txt", @"c:\temp\testdir1\files1.txt"); 
filesDic.Add(@"testdir1\file2.txt", @"c:\temp\testdir1\files2.txt"); 
filesDic.Add(@"testdir2\file1.txt", @"c:\temp\testdir2\files1.txt"); 
filesDic.Add(@"test\file3.txt", @"c:\temp2\test\files3.txt"); 

Aşağıdaki örnek, klasörleri için böyle bir sözlük oluşturma işleminin nasıl otomatikleştirileceğini gösterir. tek bir 7z arşiv dosyası.

private static void AddFilesFromDirectoryToDictionary(Dictionary<string, string> filesDictionary, 
    string pathToDirectory) 
{  
    DirectoryInfo dirInfo = new DirectoryInfo(pathToDirectory);  

    FileInfo[] fileInfos = dirInfo.GetFiles("*.*", SearchOption.AllDirectories); 

    foreach (FileInfo fi in fileInfos) 
    {   
    filesDictionary.Add(fi.FullName.Replace(dirInfo.Parent.FullName + "\\", "").ToLower(), 
     fi.FullName); 
    }   
} 

static void Main(string[] args) 
{ 
    // Set path to 7z library. 
    SevenZipCompressor.SetLibraryPath("7z.dll"); 

    using (FileStream fs = new FileStream("c:\\temp\\test.7z", FileMode.Create)) 
    {   
    SevenZipCompressor szc = new SevenZipCompressor 
           { 
            CompressionMethod = CompressionMethod.Lzma, 
            CompressionLevel = CompressionLevel.Normal, 
            CompressionMode = CompressionMode.Create,          
            DirectoryStructure = true, 
            PreserveDirectoryRoot = false, 
            ArchiveFormat = OutArchiveFormat.SevenZip 
           };   

    Dictionary<string, string> filesDictionary = new Dictionary<string, string>(); 

    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test"); 

    szc.CompressFileDictionary(filesDictionary, fs);        
    }  
} 

Ayrıca aşağıdaki kod değişiklikleri kullanarak bir Posta-arşiv oluşturabilirsiniz:

using (FileStream fs = new FileStream("c:\\temp\\test.zip", FileMode.Create)) 
{   
    SevenZipCompressor szc = new SevenZipCompressor 
      { 
      CompressionMethod = CompressionMethod.Deflate, 
      CompressionLevel = CompressionLevel.Normal, 
      CompressionMode = CompressionMode.Create,          
      DirectoryStructure = true, 
      PreserveDirectoryRoot = false, 
      ArchiveFormat = OutArchiveFormat.Zip 
      };   

    Dictionary<string, string> filesDictionary = new Dictionary<string, string>(); 

    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test"); 

    szc.CompressFileDictionary(filesDictionary, fs);        
} 
+0

@subirshan: cevabım faydası oluyor mu? – Hans

+0

Bu sadece .7z dosyaları için çalışır ve değil .zip dosyaları çalışır? bu doğru mu? –

+1

@MarkRedman: Ayrıca bir .zip arşivi de oluşturabilirsiniz. .zip arşivinin nasıl oluşturulacağını göstermek için cevabımı güncelledim. AddFilesFromDirectoryToDictionary() işlevinde de küçük bir hata düzeltdim. – Hans

İlgili konular