Próbuję programowo rozpakować skompresowany plik.
Próbowałem użyć System.IO.Compression.GZipStream
klasy w .NET, ale kiedy moja aplikacja działa (właściwie test jednostkowy), otrzymuję ten wyjątek:
System.IO.InvalidDataException: Magiczna liczba w nagłówku GZip jest niepoprawna. Upewnij się, że przekazujesz strumień GZip.
Teraz zdaję sobie sprawę, że .zip
plik nie jest taki sam jak .gz
plik i GZip
to nie to samo co Zip
.
Ponieważ jednak mogę wyodrębnić plik, ręcznie klikając dwukrotnie plik spakowany, a następnie klikając przycisk „Wyodrębnij wszystkie pliki”, myślę, że powinien istnieć sposób na zrobienie tego również w kodzie.
Dlatego próbowałem użyć Process.Start()
ścieżki do skompresowanego pliku jako danych wejściowych. Powoduje to, że moja aplikacja otwiera okno pokazujące zawartość w spakowanym pliku. Wszystko w porządku, ale aplikacja zostanie zainstalowana na serwerze i nie będzie nikogo, kto kliknie przycisk „Wyodrębnij wszystkie pliki”.
Jak mogę uzyskać aplikację, aby wyodrębniała pliki z plików spakowanych?
Czy jest inny sposób? Wolę robić to w kodzie, bez pobierania bibliotek lub aplikacji stron trzecich; Departament Bezpieczeństwa nie jest zbyt fantazyjny ...
Odpowiedzi:
Z powodzeniem korzystaliśmy z SharpZipLib w wielu projektach. Wiem, że jest to narzędzie innej firmy, ale kod źródłowy jest dołączony i może zapewnić pewien wgląd, jeśli zdecydujesz się na nowo wynaleźć koło tutaj.
źródło
W .NET 4.5 możesz teraz rozpakować pliki za pomocą .NET Framework:
Powyższy kod pochodzi bezpośrednio z dokumentacji Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
jest zawarty w zestawieSystem.IO.Compression.FileSystem
. (Dzięki nateirvin ... patrz komentarz poniżej)źródło
ZipFile
jest zawarty w zestawieSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Ktoś na to?Dla .Net 4.5+
Zapisywanie nieskompresowanego pliku na dysku nie zawsze jest pożądane. Jako programista ASP.Net musiałbym majstrować przy uprawnieniach do nadawania uprawnień mojej aplikacji do zapisu w systemie plików. Pracując ze strumieniami w pamięci, mogę ominąć to wszystko i bezpośrednio odczytać pliki:
Alternatywnie nadal możesz zapisać rozpakowany plik na dysk, wywołując
ExtractToFile()
:Aby użyć tej
ZipArchive
klasy, musisz dodać odwołanie doSystem.IO.Compression
przestrzeni nazw i doSystem.IO.Compression.FileSystem
.źródło
ZipArchive
obiekt ładnie pasuje do rachunku.foreach
pętli,ExtractToFile
kiedy mogę po prostu użyćZipFile.ExtractToDirectory(inputFile, outputDir);
Jakie są zalety pierwszej metody?Darmowe i brak zewnętrznych plików DLL. Wszystko jest w jednym pliku CS. Jedno pobranie to tylko plik CS, inne pobranie jest bardzo łatwym do zrozumienia przykładem. Właśnie wypróbowałem go dzisiaj i nie mogę uwierzyć, jak prosta była konfiguracja. Działa przy pierwszej próbie, bez błędów, bez niczego.
https://github.com/jaime-olivares/zipstorer
źródło
Skorzystaj z biblioteki DotNetZip pod adresem http://www.codeplex.com/DotNetZip
źródło
Aby użyć klasy ZipFile, należy dodać odwołanie do zestawu System.IO.Compression.FileSystem w swoim projekcie
źródło
Standardowe pliki zip zwykle używają algorytmu deflacji.
Aby wyodrębnić pliki bez korzystania z bibliotek stron trzecich, użyj DeflateStream. Będziesz potrzebował nieco więcej informacji na temat formatu archiwum zip, ponieważ Microsoft zapewnia tylko algorytm kompresji.
Możesz także spróbować użyć zipfldr.dll. Jest to biblioteka kompresji Microsoft (skompresowane foldery z menu Wyślij do). Wygląda na bibliotekę com, ale jest nieudokumentowana. Możesz być w stanie sprawić, by działał dla ciebie poprzez eksperymenty.
źródło
Używam tego do spakowania lub rozpakowania wielu plików. Materiały Regex nie są wymagane, ale używam ich do zmiany datownika i usuwania niechcianych podkreśleń. Używam pustego ciągu w ciągu Compress >> zipPath, aby w razie potrzeby poprzedzić coś do wszystkich plików. Ponadto zwykle komentuję Compress () lub Decompress () w oparciu o to, co robię.
źródło
To wystarczy
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
źródło
Od tutaj :
źródło
Możesz to wszystko zrobić w .NET 3.5 za pomocą DeflateStream. Brakuje w .NET 3.5 możliwości przetwarzania sekcji nagłówków plików, które służą do organizowania spakowanych plików. PKWare opublikowało te informacje, których można użyć do przetworzenia pliku zip po utworzeniu używanych struktur. Nie jest to szczególnie uciążliwe i jest dobrą praktyką w budowaniu narzędzi bez użycia kodu innej firmy.
To nie jest odpowiedź jednoliniowa, ale jest całkowicie wykonalna, jeśli sam chcesz i nie spiesz się. Napisałem klasę, aby to zrobić w ciągu kilku godzin, a otrzymałem z tego możliwość zipowania i rozpakowywania plików tylko przy użyciu .NET 3.5.
źródło
Dowiedziałem się o tym dzisiaj (pakiet Unzip na NuGet), ponieważ natknąłem się na poważny błąd w DotNetZip i zdałem sobie sprawę, że tak naprawdę niewiele pracy wykonano w DotNetZip przez ostatnie dwa lata.
Pakiet Unzip jest szczupły i wykonał to za mnie - nie miał błędu, który miał DotNetZip. Był to również stosunkowo niewielki plik, opierający się na Microsoft BCL dla faktycznej dekompresji. Z łatwością mogłem dokonać niezbędnych korekt (aby móc śledzić postęp podczas dekompresji). Polecam to.
źródło
Z Osadzonych zasobów:
źródło
Do tej pory korzystałem z procesów cmd, aby wyodrębnić plik .iso, skopiować go do tymczasowej ścieżki z serwera i wyodrębnić na pamięci USB. Ostatnio odkryłem, że działa to doskonale z .iso, które są mniejsze niż 10 Gb. W przypadku ISO, takiego jak 29Gb, ta metoda jakoś utknęła.
źródło
możesz użyć kodu wiersza polecenia Info-unzip. wystarczy pobrać unzip.exe z oficjalnej strony Info-unzip.
źródło