Czy ktoś wie o dobrym sposobie szybkiego kompresowania lub dekompresji plików i folderów w języku C#? Obsługa dużych plików może być konieczna.Kompresowanie/dekompresowanie folderów i plików
Odpowiedz
Począwszy od .Net 1.1 jedyną dostępną metodą jest sięganie do bibliotek java.
Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C# Nie jestem pewien, czy to się zmieniło w najnowszych wersjach.
Zawsze korzystałem z biblioteki SharpZip.
Można użyć 3rd-party library such as SharpZip jak Tom zauważył.
Innym sposobem (bez przechodzenia na stronę trzecią) jest użycie interfejsu API powłoki systemu Windows. Konieczne będzie ustawienie odwołania do biblioteki COM Microsoft Shell Controls i Automation w projekcie C#. Gerald Gibson ma na przykład:
http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx
Jest to bardzo proste do wykonania w Javie, i jak stwierdzono powyżej można dotrzeć do bibliotek java.util.zip z C#. O referencje patrz:
java.util.zip javadocs
sample code
Kiedyś to jakiś czas temu, aby zrobić głęboki (zip) rekurencyjnej struktury folderów, ale nie sądzę, bym kiedykolwiek użył rozpakowaniu. Jeśli jestem tak zmotywowany, mogę wyciągnąć ten kod i edytować go później.
Przestrzeń nazw schematu .Net 2.0 System.IO.Compression
obsługuje algorytmy GZip i Deflate. Oto dwie metody kompresji i dekompresji strumienia bajtów, które można uzyskać z obiektu pliku. Możesz zastąpić GZipStream
dla DefaultStream
w poniższych metodach, aby użyć tego algorytmu. Pozostaje jednak problem obsługi plików skompresowanych za pomocą różnych algorytmów.
public static byte[] Compress(byte[] data)
{
MemoryStream output = new MemoryStream();
GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
gzip.Write(data, 0, data.Length);
gzip.Close();
return output.ToArray();
}
public static byte[] Decompress(byte[] data)
{
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length);
input.Position = 0;
GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);
MemoryStream output = new MemoryStream();
byte[] buff = new byte[64];
int read = -1;
read = gzip.Read(buff, 0, buff.Length);
while (read > 0)
{
output.Write(buff, 0, read);
read = gzip.Read(buff, 0, buff.Length);
}
gzip.Close();
return output.ToArray();
}
Innym dobrym rozwiązaniem jest również DotNetZip.
GZipStream to naprawdę dobre narzędzie do użycia.
Moja odpowiedź będzie zamknąć oczy i zdecydować na DotNetZip. Zostało przetestowane przez dużą społeczność.
można utworzyć plik zip z tą metodą:
public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
{
var path = HostingEnvironment.MapPath(TempPath) + name;
await Task.Run(() =>
{
if (File.Exists(path)) File.Delete(path);
ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
});
return path;
}
a następnie można rozpakować plik zip z tych metod: praca
1- tej metody ze ścieżką pliku zip
public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
{
await Task.Run(() =>
{
var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
foreach (var entry in archive.Entries)
{
entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
}
archive.Dispose();
});
}
2 - ta metoda działa ze strumieniem pliku zip
public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
{
string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
using (FileStream output = new FileStream(filePath, FileMode.Create))
{
await zipFile.CopyToAsync(output);
}
await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
await Task.Run(() => File.Delete(filePath));
}
- 1. Monitorowanie plików/folderów
- 2. Rozróżnianie folderów i plików w C++
- 3. Organizacja folderów i plików dla rozwoju Pythona
- 4. Cofanie wielu plików i folderów 'git add'
- 5. Znajdowanie plików i folderów w pakiecie OSGI
- 6. Konwencje dotyczące struktury folderów/plików?
- 7. WP7 Uzyskiwanie dostępu do plików i folderów telefonu
- 8. Uzyskiwanie plików i Lista folderów ze zdalnego serwera w PHP
- 9. Handling Paperclip folderów i plików z wykorzystaniem Ruby on Rails
- 10. Zapytanie o listę plików i folderów w katalogu głównym
- 11. Tworzenie funkcji rekursywnej do kopiowania wszystkich plików i folderów
- 12. Jak utworzyć strukturę systemu plików i folderów w Visio 2010?
- 13. Polecenie qmake do kopiowania plików i folderów do katalogu wyjściowego
- 14. Tworzenie folderów wirtualnych i podłączanie ich do systemu plików
- 15. Ruby FTP Oddzielanie plików od folderów
- 16. Automatyczne usuwanie plików/folderów w R
- 17. FileStream i tworzenie folderów
- 18. Wysublimowany tekst 3: Przeciąganie i upuszczanie, przenoszenie i tworzenie kopii plików i folderów
- 19. Lista wszystkich folderów i podfolderów
- 20. Kopiowanie folderów bez plików, pliki bez folderów lub wszystkich korzystających PowerShell
- 21. os.walk bez ukrytych folderów
- 22. Lista wszystkich plików i folderów Dropbox za pomocą API Dropbox i pobierz plik kliknięty w Androidzie
- 23. Polecenie UNIX do wyświetlania folderów z liczbą plików
- 24. Co to jest Projekt folderów ważnych plików w netbeans
- 25. Konfigurowanie zadania kopiowania tekstu w celu wykluczenia plików/folderów
- 26. Czy możesz usunąć strukturę folderów podczas kopiowania plików w haśle?
- 27. Usuwanie plików lub folderów rekurencyjnie w oknach cmd
- 28. Lista wszystkich plików ze wszystkich folderów na jednej liście
- 29. Grunt imagemin - oglądać wiele plików/folderów zoptymalizować pojedynczy plik?
- 30. Przełączanie gałęzi Git nie zmienia plików folderów kodu
Uwaga: Znalazłem * int over flow * bug w kodzie SharpZip lata temu, który spowodował awarię plików losowych, które akurat miały odpowiednią kombinację wartości. Nie jestem pewien, czy to kiedykolwiek zostało naprawione, ale z pamięci zmieniłem zmienną 'int' na' long' w źródle SharpZip, aby uniknąć przepełnienia. * Będę musiał spróbować znaleźć mój stary poprawiony kod SharpZip i sprawdzić, czy pasuje do najnowszego *. –