распаковать файл на С# через Winzip и его расширение cmd

поэтому у меня есть небольшой фрагмент кода, который обнаруживает файлы в папке и систематически сжимает их после достижения ими определенного возраста. Сейчас я работаю над фрагментом кода для распаковки файлов определенного диапазона дат по запросу пользователя для использования в программном обеспечении.

Моя проблема в том, что строка командной строки для архивирования файлов отлично работает, но распаковка не работает... ниже приведен фрагмент кода, показывающий, как я распаковываю. Пожалуйста, дайте мне знать, что мне следует сделать по-другому, чтобы обеспечить распаковку. Спасибо!

private void UnZipFile()
        {
            if (myRecord == null)
            {
                if (File.Exists(zipInfo.FullName))
                {                        
                    Process LogUnzipper = new Process();
                    //32-bit system
                    if (File.Exists("c:\\Program Files\\WinZip\\WZZIP.exe"))
                    {
                        //WZZIP.exe being the WinZip executable
                        LogUnzipper.StartInfo.FileName = "c:\\Program Files\\WinZip\\WZZIP.exe";
                    }
                    //64-bit system
                    else if (File.Exists("c:\\Program Files (x86)\\WinZip\\WZZIP.exe"))
                    {
                        //WZZIP.exe being the WinZip executable
                        LogUnzipper.StartInfo.FileName = "c:\\Program Files (x86)\\WinZip\\WZZIP.exe";
                    }
                    //here is where I think I'm screwing up something..
                    string action = "-e " + "\"" + zipInfo.FullName + "\"" + " \"" + zipInfo.DirectoryName + "\"";
                    //happen in background
                    LogUnzipper.StartInfo.CreateNoWindow = true;
                    LogUnzipper.StartInfo.UseShellExecute = false;
                    LogUnzipper.StartInfo.Arguments = action;
                    LogUnzipper.Start();
                    while (!LogUnzipper.HasExited)
                    {
                        LogUnzipper.WaitForExit(500);// 1/2 sec
                    }
                    //adding break point at this line yields no unzipped Log file :(
                }
                ...

мои мысли таковы, что я как-то неправильно называю cmd в string action? даже если я проверю это в командной строке Windows, это правильное форматирование.

*** следует отметить, что ZipInfo.FullName — это что-то вроде: «C:\Users\16208\Software\Beta\logs\6_2013\Log_10AM_to_11AM.zip», что касается формата, поэтому я даю точный путь к заархивированный элемент.


person Medic3000    schedule 02.07.2013    source источник
comment
Используйте настоящую ZIP-библиотеку C#.   -  person SLaks    schedule 02.07.2013
comment
@DarthSheldon Существует несколько zip-библиотек .NET, таких как DotNetZip и SharpZipLib. Оба эти варианта предпочтительнее запуска WinZip (не в последнюю очередь потому, что у конечного пользователя WinZip может быть не установлен).   -  person keyboardP    schedule 02.07.2013
comment
они будут, это программное обеспечение поставляется с winzip, это требование, чтобы я использовал определенные библиотеки и программное обеспечение из-за лицензирования. Winzip — одна из разрешенных библиотек, но любые другие библиотеки должны быть созданы собственными силами.   -  person Medic3000    schedule 02.07.2013
comment
@DarthSheldon - О, хорошо. В этом случае вы можете извлечь, используя те же параметры командной строки, когда вы используете cmd напрямую? (просто чтобы убедиться, что это проблема с кодом)   -  person keyboardP    schedule 02.07.2013
comment
да, я думаю, что это упомянуто в вопросе, но я использовал идентичную строку «действие», заменив ZipInfo.FileName полным zip-именем, а также папку для извлечения.   -  person Medic3000    schedule 02.07.2013
comment
@DarthSheldon Немного выстрела в темноте, но может ли это потребовать речевых меток вокруг всего набора аргументов? "\"-e \"" + zipInfo...."\"\"";   -  person keyboardP    schedule 02.07.2013


Ответы (2)


Вы можете использовать бесплатную библиотеку .Net с открытым исходным кодом для архивирования и распаковки (как предложил SLaks). Например, DotNetZip.

    using (ZipFile decompress = ZipFile.Read(ZipFilePath))
    {    
        foreach (ZipEntry e in decompress)
        {
            e.Extract(TargetPath, ExtractExistingFileAction.OverwriteSilently);
        }
    }

Что касается вашего кода, ожидания полсекунды может быть недостаточно для завершения распаковки. Также вы можете попробовать запустить команду unzip в командной строке и проверить вывод.

person alex    schedule 02.07.2013
comment
в основном я должен использовать Win-zip - person Medic3000; 02.07.2013
comment
+1: DotNetZip рулит. Это по крайней мере так же быстро, как WinZip или Zip/Unzip. - person Nicholas Carey; 02.07.2013
comment
не имеет значения, это необходимая функция программного обеспечения - person Medic3000; 02.07.2013

Если у вас установлен WinZip, попробуйте следующее:

System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", @"/c start winzip32 -e " + fileName + @" C:\SomeDirectory");
rocStartInfo.UseShellExecute = false;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
proc.WaitForExit();

Где fileName — это полный путь к вашему файлу *.rar.

person Ilyakom    schedule 05.03.2015