Chcę skompresować 3 foldery do jednego pliku przy użyciu SevenZipCompressor. Wiem, jak skompresować pojedynczy folder. Czy jest coś takiego?SevenZipSharp - jak skompresować wiele katalogów do jednego pliku przy użyciu C#?
Dziękujemy!
Chcę skompresować 3 foldery do jednego pliku przy użyciu SevenZipCompressor. Wiem, jak skompresować pojedynczy folder. Czy jest coś takiego?SevenZipSharp - jak skompresować wiele katalogów do jednego pliku przy użyciu C#?
Dziękujemy!
Klasa SevenZipCompressor
udostępnia metodę o nazwie CompressFileDictionary()
. Jedna z metod przeciążenia oczekuje na słownik plików i strumień plików. Słownik plików jest zwykłym .Net Dictionary<string,string>
. Kluczem słownika jest nazwa (lub ścieżka względna) pliku w archiwum, wartość słownika jest ścieżką do pliku w systemie plików.
Klawisz ze słownika pozwala kontrolować strukturę w archiwum 7z. Na przykład, jeśli chcesz skompresować trzy foldery
c:\temp\testdir1
|- file1.txt
|- file2.txt
c:\temp\testdir2
|- file1.txt
c:\temp2\test
|- file3.txt
i uzyskaną strukturę w archiwum powinny być
testdir1
|- file1.txt
|- file2.txt
testdir2
|- file1.txt
test
|-file3.txt
wtedy wystarczy dodać pliki do dictonary w następujący sposób:
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");
Poniższy przykład pokazuje, jak zautomatyzować proces tworzenia takiego słownika dla folderów i skompresować go do pojedynczy plik archiwum 7z.
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);
}
}
Można również utworzyć archiwum ZIP użyciu następujących zmian w kodzie:
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: Czy moja odpowiedź pomoże? – Hans
Wygląda na to, że działa tylko dla plików .7z, a nie plików .zip? czy to jest poprawne? –
@MarkRedman: Możesz również utworzyć archiwum .zip. Zaktualizowałem swoją odpowiedź, aby pokazać, jak utworzyć archiwum .zip. Naprawiłem również drobny błąd w funkcji AddFilesFromDirectoryToDictionary(). – Hans