7

ExtractProgressEventArgs.EntriesTotalandはExtractProgressEventArgs.EntriesExtracted常にゼロです。これは既知のバグですか? 以下の私のコードを参照してください:

public static void UnZip(string zipFile, string destination)
{
    using(ZipFile zip = ZipFile.Read(zipFile))
    {                
        zip.ExtractProgress += new EventHandler<ExtractProgressEventArgs>(zip_ExtractProgress);

        foreach (ZipEntry entry in zip)
        {
            entry.Extract(destination, ExtractExistingFileAction.OverwriteSilently);                    
        }
        Console.WriteLine("DONE");
    }
}

static void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)
{
    if(e.EventType == ZipProgressEventType.Extracting_AfterExtractEntry)
        Console.WriteLine(String.Format("{0} : {1} / {2} = {3}%", e.CurrentEntry.FileName, e.EntriesTotal, e.EntriesExtracted, ((double)e.EntriesTotal / (double)e.EntriesExtracted) * 100.00));
}
4

1 に答える 1

4

定義された動作:

http://cheeso.members.winisp.net/DotNetZipHelp/html/91d797c7-efff-99a3-2b14-6c9a9797b324.htmから

EntrancesExtractedこれまでに抽出されたエントリの数。これは、EventTypeがExtracting_BeforeExtractEntryまたはExtracting_AfterExtractEntryであり、ExtractAll()の呼び出しのスコープでExtract()が発生している場合にのみ設定されます。

この理由は単純です。自分で制御するループでExtract()を呼び出すと、ライブラリは、それを呼び出す予定の回数、連続して呼び出した回数を知る方法がありません。最初の5回をカウントし、次の5回をカウントするかどうかなど。したがって、DotNetZipは、実行した回数に関する信頼できる情報を提供できません。

2つの簡単な回避策があります。

  • ループ内のExtract()を呼び出すたびにインクリメントするintカウンターを使用します。

  • ExtractAll()を呼び出します。その場合EntriesExtracted、意味のある数値に設定された値でExtractProgressEventsを発行します。

オプション1:

    int n;
    using(ZipFile zip = ZipFile.Read(zipFile))
    {                
        zip.ExtractProgress += zip_ExtractProgress;
        n = 0;
        foreach (ZipEntry entry in zip)
        {
            n++;
            entry.Extract(destination, ExtractExistingFileAction.OverwriteSilently);                    
        }
        Console.WriteLine("DONE");
    }

オプション2:

    using(ZipFile zip = ZipFile.Read(zipFile))
    {                
        zip.ExtractProgress += zip_ExtractProgress;
        zip.ExtractAll(destination,
               ExtractExistingFileAction.OverwriteSilently);                    
        Console.WriteLine("DONE");
    }
于 2011-05-24T19:02:42.463 に答える