目录上的 C# DotNetZip 进度条

C# DotNetZip progressbar on directory

我有以下代码用于单个文件 zip,没有任何问题。但是当我从目录压缩(创建)时,进度条变得疯狂。

基本上,进度条不停地往复前进。图像说明。

在所选文件夹内我可能还有 10 个子文件夹。

using (ZipFile zip = new ZipFile())
{
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
    zip.SaveProgress += zipProgress;

    zip.AddDirectory(folderPath);
    zip.Save(tempPath);
}

private void zipProgress(object sender, SaveProgressEventArgs e)
{
    if (e.EventType == ZipProgressEventType.Saving_EntryBytesRead)
        this.progressbar1.Value = (int)((e.BytesTransferred * 100) / e.TotalBytesToTransfer);

    else if (e.EventType == ZipProgressEventType.Saving_Completed)
        this.progressbar1.Value = 100;
}

我确实意识到进度值不断向前和向后的事实是因为我正在压缩一个包含 10 个子文件夹的文件夹。

但是我想知道是否有任何方法可以正确显示文件夹压缩的进度条?

这是因为 "e.BytesTransferred" 是传输的字节数 每个条目 而不是总数。

Check out the docs

"The number of bytes read or written so far for this entry."

我自己也犯过同样的错误:)(虽然我是用它来提取文件的)

的基础上,一种解决方案是依赖具有类型 Saving_AfterWriteEntry 的事件,该事件发生在像这样编写每个条目之后:

if(e.EventType == ZipProgressEventType.Saving_AfterWriteEntry)
{
    this.progressbar1.Value = e.EntriesSaved * 100 / e.EntriesTotal;
}

这种方案的问题是把大文件当成了小文件,所以进度条在不同的时间会有不同的进度(取决于文件大小的不同)。