2016-08-15 5 views
0

Эта проблема решена. Моя ошибка заключалась в том, что в моем втором блоке кода я использовал SaveProgress вместо ExtractProgress, и перед настройкой обработчика событий я использовал Zip.ExtractAll. Спасибо Bradley Moorfield за помощь.DotNetZip - Показывает ход извлечения?

Так что я использую библиотеку DotNetZip для сжатия/извлечения zip-файлов по всему моему коду. Я был в состоянии достигнуть, показывающий процент сжатия с этим кодом:

   using (ZipFile zip = new ZipFile()) 
       { 
        zip.AddDirectory(filePath); 
        var mb = GetDirectorySize(filePath)/1048576; 
        long timesRunNeeded = mb/100; 
        if (mb % 100 > 0) { timesRunNeeded++; } 
        if (mb <= 100) { timesRunNeeded = 1; } 
        int timesRun = 1; 
        int pastP = 0; 
        zip.SaveProgress += (o, args) => 
        { 
         var percentage = (int)(1.0d/args.TotalBytesToTransfer * args.BytesTransferred * 100.0d); 
         if (pastP != percentage) 
         { 
          clearLine(); 
          setColor(ConsoleColor.Gray); Console.Write(" Percentage: "); setColor(ConsoleColor.Green); 
          Console.Write(percentage + " [" + timesRun + "/" + timesRunNeeded + "]"); 
          if ((percentage == 100) && (pastP >= 0) && (pastP <= 99)) 
          { 
           timesRun++; 
          } 
         } 
         pastP = percentage; 
        }; 
        zip.Save(filePath + ".zip"); 
       } 

Причина, по которой, как это beacuse он сжимает 100 мб в то время, так что, например, если папка была 2153 Мб, это d перейти на 100% 22 раза. Это все работает отлично, и мне нравится, как у меня есть, но у меня есть некоторые проблемы с отображением процента, сделанного при извлечении из zip в каталог. Вот мой код до сих пор:

     using (ZipFile zip = ZipFile.Read(filePath)) 
         { 
          Directory.CreateDirectory(filePath.Replace(".zip", "")); 
          zip.ExtractAll(filePath.Replace(".zip", ""), ExtractExistingFileAction.OverwriteSilently); 
          zip.SaveProgress += (o, args) => 
          { //Fix this, not showing percentage of extraction. 
           var percentage = (int)(1.0d/args.TotalBytesToTransfer * args.BytesTransferred * 100.0d); 
           clearLine(); 
           Console.Write(percentage); 
          }; 
         } 

По какой-то причине этот код не печатает какой-либо процент на всех, поэтому я предполагаю, что это что-то делать с тем, как я на самом деле вычислительным процентом получило. Должно ли быть другим при сжатии и экстракции? Заранее спасибо.

+1

Вам нужно добавить обработчик событий, прежде чем приступить к добыче. Кроме того, во время сохранения во время сохранения происходит событие SaveProgress. Существует другой обработчик «ExtractProgress», который запускается во время извлечения. [См. Ссылку, например, использование] (http://dotnetzip.herobo.com/DNZHelp/html/01318049-51bf-3876-e766-ad83e62fdcf5.htm) –

+0

Ах, глупая ошибка на моем конце. Я поменял его обратно на ExtractProgress (который у меня был ранее, но по какой-то причине поменялся): моя реальная проблема заключалась в том, что, как вы сказали, я использовал Zip.ExtractAll перед использованием обработчика событий. Благодаря! Не могли бы вы оставить свой комментарий в качестве ответа, чтобы я мог отметить его как принятый? –

ответ

1

Перед началом извлечения необходимо добавить обработчик событий. Кроме того, во время сохранения происходит событие SaveProgress, есть другой обработчик, ExtractProgress, который срабатывает во время извлечения.

See the reference for example usage (web.archive.org)

private static bool justHadByteUpdate = false; 
public static void ExtractProgress(object sender, ExtractProgressEventArgs e) 
{ 
    if(e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten) 
    { 
    if (justHadByteUpdate) 
     Console.SetCursorPosition(0, Console.CursorTop); 

    Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, 
       e.BytesTransferred/(0.01 * e.TotalBytesToTransfer)); 
    justHadByteUpdate = true; 
    } 
    else if(e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) 
    { 
    if (justHadByteUpdate) 
     Console.WriteLine(); 
    Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName); 
    justHadByteUpdate= false; 
    } 
} 

public static ExtractZip(string zipToExtract, string directory) 
{ 
    string TargetDirectory= "extract"; 
    using (var zip = ZipFile.Read(zipToExtract)) { 
    zip.ExtractProgress += ExtractProgress; 
    foreach (var e in zip1) 
    { 
     e.Extract(TargetDirectory, true); 
    } 
    } 
} 
+1

Хороший ответ. Ссылка не работает :) – Davlio

+1

Хорошо, что в интернет-архиве был захват. Обновлена ​​ссылка на моментальный снимок и скопирована здесь код для хорошей оценки –

 Смежные вопросы

  • Нет связанных вопросов^_^