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);
}
@subirshan: Ist meine Antwort Hilfe? – Hans
Scheint dies funktioniert nur für .7z-Dateien und nicht. ZIP-Dateien? ist das richtig? –
@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