C#DotNetZip目录上的进度条

时间:2015-12-16 22:11:52

标签: c# dotnetzip

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

基本上,进度条会不停地前进和后退。图像说明。 enter image description here

在所选文件夹中,我可能有另外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个子文件夹的一个文件夹。

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

2 个答案:

答案 0 :(得分:3)

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

Check out the docs

  

“此条目到目前为止读取或写入的字节数。”

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

答案 1 :(得分:2)

@Shazi answer的基础上,一个解决方案是依赖于在写完每个条目之后发生类型Saving_AfterWriteEntry的事件:

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

这种解决方案的问题在于它将大文件视为小文件,因此进度条在不同时间具有不同的进度速度(取决于文件大小之间的差异)。