Разархивируйте файлы программно в .net - PullRequest
198 голосов
/ 08 мая 2009

Я пытаюсь распаковать архивированный файл.

Я пытался использовать класс System.IO.Compression.GZipStream в .NET, но когда мое приложение запускается (на самом деле модульный тест), я получаю следующее исключение:

System.IO.InvalidDataException: магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip.

Теперь я понимаю, что файл .zip не совпадает с файлом .gz, и что GZip не совпадает с Zip.

Однако, поскольку я могу извлечь файл, дважды щелкнув вручную сжатый файл и затем нажав кнопку «Извлечь все файлы», я думаю, что в коде должен быть способ сделать это.

Поэтому я попытался использовать Process.Start() с путем к архивному файлу в качестве ввода. Это заставляет мое приложение открывать окно, показывающее содержимое в заархивированном файле. Это все нормально, но приложение будет установлено на сервере, который не нажимает кнопку «Извлечь все файлы».

Итак, как мне заставить мое приложение извлекать файлы в заархивированных файлах?

Или есть другой способ сделать это? Я предпочитаю делать это в коде, без загрузки каких-либо сторонних библиотек или приложений; отдел безопасности не слишком увлекается этим ...

Ответы [ 15 ]

1 голос
/ 08 мая 2009

С здесь :

Сжатые объекты GZipStream написаны в файл с расширением .gz можно быть распакованным с использованием многих общих инструменты сжатия; Тем не менее, этот класс по своей сути не обеспечивает функциональность для добавления файлов или извлечение файлов из архивов .zip.

0 голосов
/ 08 августа 2018

вы можете использовать Info-unzip командную строку cod.you нужно всего лишь скачать unzip.exe с официального сайта Info-unzip.

 internal static void Unzip(string sorcefile)
    {
        try
        {
            AFolderFiles.AFolderFilesDelete.DeleteFolder(TempBackupFolder); // delete old folder   
            AFolderFiles.AFolderFilesCreate.CreateIfNotExist(TempBackupFolder); // delete old folder   
           //need to Command command also to export attributes to a excel file
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; // window type
            startInfo.FileName = UnzipExe;
            startInfo.Arguments = sorcefile + " -d " + TempBackupFolder;
            process.StartInfo = startInfo;
            process.Start();
            //string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Dispose();
            process.Close();
        }
        catch (Exception ex){ throw ex; }
    }        
0 голосов
/ 07 сентября 2017

До сих пор я использовал процессы cmd для извлечения файла .iso, копирования его во временный путь с сервера и извлечения на флешку. Недавно я обнаружил, что это прекрасно работает с .iso, которые меньше, чем 10 ГБ. Для iso, такого как 29Gb, этот метод как-то застревает.

    public void ExtractArchive()
    {
        try
        {

            try
            {
                Directory.Delete(copyISOLocation.OutputPath, true); 
            }
            catch (Exception e) when (e is IOException || e is UnauthorizedAccessException)
            {
            }

            Process cmd = new Process();
            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

            //stackoverflow
            cmd.StartInfo.Arguments = "-R";

            cmd.Disposed += (sender, args) => {
                Console.WriteLine("CMD Process disposed");
            };
            cmd.Exited += (sender, args) => {
                Console.WriteLine("CMD Process exited");
            };
            cmd.ErrorDataReceived += (sender, args) => {
                Console.WriteLine("CMD Process error data received");
                Console.WriteLine(args.Data);
            };
            cmd.OutputDataReceived += (sender, args) => {
                Console.WriteLine("CMD Process Output data received");
                Console.WriteLine(args.Data);
            };

            //stackoverflow


            cmd.Start();

            cmd.StandardInput.WriteLine("C:");
            //Console.WriteLine(cmd.StandardOutput.Read());
            cmd.StandardInput.Flush();

            cmd.StandardInput.WriteLine("cd C:\\\"Program Files (x86)\"\\7-Zip\\");
            //Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            cmd.StandardInput.Flush();

            cmd.StandardInput.WriteLine(string.Format("7z.exe x -o{0} {1}", copyISOLocation.OutputPath, copyISOLocation.TempIsoPath));
            //Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            cmd.StandardInput.Flush();
            cmd.StandardInput.Close();
            cmd.WaitForExit();
            Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            Console.WriteLine(cmd.StandardError.ReadToEnd());
0 голосов
/ 13 января 2016

Из встроенных ресурсов:

using (Stream _pluginZipResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(programName + "." + "filename.zip"))
{
    using (ZipArchive zip = new ZipArchive(_pluginZipResourceStream))
    {
        zip.ExtractToDirectory(Application.StartupPath);
    }
}
0 голосов
/ 08 ноября 2013

Я узнал о этом (распаковать пакет на NuGet) сегодня, так как столкнулся с серьезной ошибкой в ​​DotNetZip и понял, что на DotNetZip не так уж много работы последние два года.

Пакет Unzip скудный, и он сделал всю работу за меня - в нем не было ошибки, которая была в DotNetZip. Кроме того, это был достаточно маленький файл, основанный на Microsoft BCL для фактической распаковки. Я мог легко вносить необходимые изменения (чтобы иметь возможность отслеживать прогресс при распаковке). Я рекомендую это.

...