Jak mogę tworzyć archiwa 7-Zip z mojej aplikacji konsoli C #? Muszę mieć możliwość wypakowania archiwów za pomocą zwykłego, szeroko dostępnego programu 7-Zip .
Oto moje wyniki z przykładami podanymi jako odpowiedzi na to pytanie
- „Wyłuskiwanie” do 7z.exe - to najprostsze i najskuteczniejsze podejście i mogę potwierdzić, że ładnie działa . Jak wspomina workmad3 , muszę tylko zagwarantować, że 7z.exe jest zainstalowany na wszystkich maszynach docelowych, co mogę zagwarantować.
- 7Zip w kompresji pamięci - dotyczy to kompresji plików cookie „w pamięci” przed wysłaniem do klienta; ta metoda wydaje się nieco obiecująca. Metody opakowujące (opakowanie LZMA SDK ) zwracają typ
byte[]
. Kiedy piszębyte[]
tablicę do pliku, nie mogę jej wyodrębnić za pomocą 7-Zip (File.7z is not supported archive
). - 7zSharp Wrapper (znaleziony w CodePlex) - otacza 7z exe / LZMA SDK . Odwołałem się do projektu z mojej aplikacji i pomyślnie utworzyłem kilka plików archiwum, ale nie mogłem wyodrębnić plików za pomocą zwykłego programu 7-Zip (
File.7z is not supported archive
). - 7Zip SDK aka LZMA SDK - myślę, że nie jestem wystarczająco inteligentny, aby dowiedzieć się, jak tego użyć (dlatego opublikowałem tutaj) ... Wszelkie działające przykłady kodu demonstrujące tworzenie archiwum 7zip, które można wyodrębnić przez zwykły program 7zip?
- Interfejs CodeProject C # (.NET) dla bibliotek DLL archiwum 7-Zip - obsługuje tylko wyodrębnianie z archiwów 7zip ... Muszę je utworzyć!
- SharpZipLib - zgodnie z ich FAQ , SharpZipLib nie obsługuje 7zip.
c#
.net
compression
7zip
Seibar
źródło
źródło
Odpowiedzi:
Jeśli możesz zagwarantować, że aplikacja 7-zip zostanie zainstalowana (i w ścieżce) na wszystkich komputerach docelowych, możesz ją odciążyć, wywołując aplikację wiersza poleceń 7z. Nie jest to najbardziej eleganckie rozwiązanie, ale najmniej pracy.
źródło
Przykład pliku cookie EggCafe 7Zip To jest przykład (plik cookie kompresujący) z biblioteką DLL 7Zip.
CodePlex Wrapper To jest projekt open source, który wypacza funkcję kompresowania 7z.
7Zip SDK Oficjalny SDK dla 7zip (C, C ++, C #, Java) <--- Moja sugestia
Biblioteka .Net zip firmy SharpDevelop.net
Przykład CodeProject z 7zip
SharpZipLib Wiele zamków błyskawicznych
źródło
SevenZipSharp to kolejne rozwiązanie. Tworzy archiwa 7-zip ...
źródło
Oto kompletny przykład roboczy przy użyciu zestawu SevenZip SDK w języku C #.
Będzie zapisywać i odczytywać standardowe pliki 7zip utworzone przez aplikację Windows 7zip.
PS. Poprzedni przykład nigdy nie był dekompresowany, ponieważ nigdy nie zapisywał wymaganych informacji o właściwościach na początku pliku.
źródło
Użyłem sdk.
na przykład:
źródło
Wystarczy zainstalować 7 zip ze źródła i przekazać parametr do metody.
Dzięki. Proszę polub odpowiedź.
źródło
Używam tego kodu
źródło
Zainstaluj pakiet NuGet o nazwie
SevenZipSharp.Interop
Następnie:
źródło
Kilka dodatkowych informacji testowych na temat kodu @Orwellophile przy użyciu pliku tekstowego 17,9 MB.
Używanie wartości właściwości w przykładowym kodzie „tak jak jest” będzie miało OGROMNY negatywny wpływ na wydajność, zajmuje to 14,16 sekundy .
Ustawienie właściwości na następujące wykonaj to samo zadanie w 3,91 sekundy (np. Archiwum będzie miało te same informacje o kontenerze, czyli: możesz rozpakować i przetestować archiwum za pomocą 7zip, ale nie ma informacji o nazwie pliku)
Natywny 7zip 2 sek.
Zrobiłem kolejny test przy użyciu natywnego 7zip i 1,2 GB pliku kopii zapasowej SQL (.bak)
7zip (maksymalna kompresja): 1 minuta
LZMA SDK (@Orwellophile z powyższym ustawieniem właściwości): 12:26 min :-(
Plik wyjściowy mniej więcej ten sam rozmiar .
Myślę więc, że sam użyję rozwiązania opartego na silniku c / c ++, np. Albo wywołam plik wykonywalny 7zip z c #, albo użyję squid-box / SevenZipSharp , który jest opakowaniem wokół pliku dll 7zip c / c ++ i wydaje się być najnowszym widelcem SevenZipSharp. Nie testowałem opakowania, ale mam nadzieję, że działa tak samo, jak natywny 7zip. Ale miejmy nadzieję, że da to możliwość kompresji strumienia, czego oczywiście nie możesz, jeśli zadzwonisz bezpośrednio do exe. W przeciwnym razie myślę, że nie ma żadnej przewagi nad wywołaniem exe. Opakowanie ma kilka dodatkowych zależności, więc nie spowoduje, że opublikowany projekt będzie „czystszy”.
Swoją drogą wydaje się, że zespół .Net Core rozważa zaimplementowanie LZMA w klasie system.io w .Core ver. 5, byłoby świetnie!
(Wiem, że to rodzaj komentarza, a nie odpowiedzi, ale aby móc podać fragment kodu, nie może to być komentarz)
źródło
Najłatwiejszym sposobem jest praca z plikami .zip zamiast .7z i użycie Dot Net Zip
Podczas wyłączania poleceń 7zip do powłoki występują inne problemy, takie jak uprawnienia użytkownika, miałem problem z SevenZipSharp.
źródło
SharpCompress to moim zdaniem jedna z najmądrzejszych bibliotek kompresji. Obsługuje LZMA (7-zip), jest łatwy w użyciu i aktywnie rozwijany.
Ponieważ ma już obsługę przesyłania strumieniowego LZMA, w momencie pisania tego tekstu obsługuje niestety tylko odczyt archiwów 7-zip. ALE zapis archiwalny jest na ich liście zadań do wykonania (zobacz plik readme). Dla przyszłych czytelników: sprawdź, czy aktualny status jest dostępny tutaj: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md
źródło