Я пытаюсь распаковать архивированный файл.
Я пытался использовать System.IO.Compression.GZipStream
класс в .NET, но когда мое приложение работает (на самом деле модульный тест), я получаю это исключение:
System.IO.InvalidDataException: магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip.
Теперь я понимаю, что .zip
файл не совпадает с .gz
файлом, и это GZip
не то же самое, что Zip
.
Однако, поскольку я могу извлечь файл, дважды щелкнув вручную сжатый файл и нажав кнопку «Извлечь все файлы», я думаю, что в коде должен быть способ сделать это.
Поэтому я попытался использовать Process.Start()
путь к архивному файлу в качестве входных данных. Это заставляет мое приложение открывать окно, показывающее содержимое в заархивированном файле. Это все нормально, но приложение будет установлено на сервере, который не нажимает кнопку «Извлечь все файлы».
Итак, как мне заставить мое приложение извлекать файлы в заархивированных файлах?
Или есть другой способ сделать это? Я предпочитаю делать это в коде, без загрузки каких-либо сторонних библиотек или приложений; отдел безопасности не слишком увлекается этим ...
Ответы:
Мы успешно использовали SharpZipLib во многих проектах. Я знаю, что это сторонний инструмент, но исходный код включен и может дать некоторую информацию, если вы решите изобретать колесо здесь.
источник
С .NET 4.5 теперь вы можете разархивировать файлы с помощью .NET Framework:
Приведенный выше код был взят непосредственно из документации Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
содержится в сборкеSystem.IO.Compression.FileSystem
. (Спасибо nateirvin ... см. Комментарий ниже)источник
ZipFile
содержится в сборкеSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Есть хоть что-нибудь по этому поводу?Для .Net 4.5+
Не всегда желательно записывать несжатый файл на диск. Как разработчик ASP.Net, мне пришлось бы возиться с разрешениями, чтобы предоставить права моему приложению на запись в файловую систему. Работая с потоками в памяти, я могу обойти все это и читать файлы напрямую:
Кроме того, вы все равно можете записать распакованный файл на диск, вызвав
ExtractToFile()
:Чтобы использовать
ZipArchive
класс, вам нужно будет добавить ссылку наSystem.IO.Compression
пространство имен и наSystem.IO.Compression.FileSystem
.источник
ZipArchive
объект отвечает всем требованиям.foreach
цикл,ExtractToFile
когда я могу просто использоватьZipFile.ExtractToDirectory(inputFile, outputDir);
Каково преимущество первого метода?Бесплатно, и никаких внешних файлов DLL. Все в одном файле CS. Одна загрузка - это просто файл CS, другая загрузка - очень простой для понимания пример. Только что попробовал сегодня, и я не могу поверить, насколько простой была установка. Сработало с первой попытки, без ошибок, без ничего.
https://github.com/jaime-olivares/zipstorer
источник
Используйте библиотеку DotNetZip по адресу http://www.codeplex.com/DotNetZip
источник
Чтобы использовать класс ZipFile, необходимо добавить ссылку на сборку System.IO.Compression.FileSystem в вашем проекте.
источник
Стандартные zip-файлы обычно используют алгоритм deflate.
Для извлечения файлов без использования сторонних библиотек используйте DeflateStream. Вам понадобится немного больше информации о формате архива zip-файла, поскольку Microsoft предоставляет только алгоритм сжатия.
Вы также можете попробовать использовать zipfldr.dll. Это библиотека сжатия Microsoft (сжатые папки из меню «Отправить»). Похоже, это библиотека, но она недокументирована. Вы можете быть в состоянии заставить это работать на Вас через эксперименты.
источник
Я использую это, чтобы сжать или разархивировать несколько файлов. Regex не требуется, но я использую его для изменения отметки даты и удаления нежелательных подчеркиваний. Я использую пустую строку в строке Compress >> zipPath для добавления префикса ко всем файлам, если это необходимо. Кроме того, я обычно комментирую либо Compress (), либо Decompress () в зависимости от того, что я делаю.
источник
Это сделает это
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
источник
От сюда :
источник
Вы можете сделать все это в .NET 3.5, используя DeflateStream. В .NET 3.5 не хватает возможности обрабатывать разделы заголовков файлов, которые используются для организации сжатых файлов. PKWare опубликовал эту информацию, которую вы можете использовать для обработки zip-файла после создания используемых структур. Это не особенно обременительно, и это хорошая практика в создании инструментов без использования стороннего кода.
Это не однострочный ответ, но это вполне выполнимо, если вы хотите и можете не торопиться. Я написал для этого класс за пару часов, и из этого я получил возможность архивировать и распаковывать файлы только с использованием .NET 3.5.
источник
Я узнал об этом (пакет Unzip на NuGet) сегодня, так как столкнулся с серьезной ошибкой в DotNetZip и понял, что за последние два года не было так много работы над DotNetZip.
Пакет Unzip скудный, и он сделал свою работу за меня - в нем не было ошибки, которая была в DotNetZip. Кроме того, это был достаточно маленький файл, основанный на Microsoft BCL для фактической распаковки. Я мог легко внести необходимые изменения (чтобы отслеживать прогресс при распаковке). Я рекомендую это.
источник
Из Embed Ressources:
источник
До сих пор я использовал процессы cmd для извлечения файла .iso, копирования его во временный путь с сервера и извлечения на USB-флешку. Недавно я обнаружил, что это прекрасно работает с .iso, которые меньше, чем 10 ГБ. Для iso как 29Gb этот метод как-то застревает.
источник
Вы можете использовать командную строку Info-unzip cod.you нужно всего лишь скачать unzip.exe с официального сайта Info-unzip.
источник