2013-08-09 2 views

Antwort

5

Die Klasse SevenZipCompressor bietet eine Methode namens CompressFileDictionary(). Eine der Methodenüberladungen erwartet ein Dateiwörterbuch und einen Dateistream. Das Dateiverzeichnis ist ein gewöhnliches .Net Dictionary<string,string>. Der Schlüssel des Wörterbuchs ist der Name (oder relative Pfad) der Datei in das Archiv, der Wert des Wörterbuchs ist der Pfad zu der Datei im Dateisystem.

Der Schlüssel des Wörterbuchs ermöglicht es Ihnen, die Struktur im 7z-Archiv zu steuern. Zum Beispiel, wenn Sie die drei Ordner

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

und die resultierende Struktur im Archiv sollte

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

fügen Sie dann komprimieren, nur die Dateien in den dictonary auf folgende Weise:

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

Das Beispiel unten zeigt nur, wie man den Prozess der Erstellung ein solches Wörterbuch für Ordner zu automatisieren und es in komprimieren eine einzelne 7z Archivdatei.

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);        
    }  
} 

Sie können auch ein ZIP-Archiv erstellen folgende Änderungen am Code verwenden:

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: Ist meine Antwort Hilfe? – Hans

+0

Scheint dies funktioniert nur für .7z-Dateien und nicht. ZIP-Dateien? ist das richtig? –

+1

@MarkRedman: Sie können auch ein ZIP-Archiv erstellen. Ich habe meine Antwort aktualisiert, um zu zeigen, wie ein .zip-Archiv erstellt wird. Ich habe auch einen kleineren Fehler in der Funktion AddFilesFromDirectoryToDictionary() behoben. – Hans

Verwandte Themen