【问题标题】:C# DotNetZip progressbar on directory目录上的 C# DotNetZip 进度条
【发布时间】:2015-12-16 22:11:52
【问题描述】:

我有以下代码适用于单个文件 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 个子文件夹的文件夹。

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

【问题讨论】:

标签: c# dotnetzip


【解决方案1】:

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

Check out the docs

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

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

【讨论】:

  • 你有同样的解决方案吗?
【解决方案2】:

@Shazi answer 的基础上,一种解决方案是依赖于具有Saving_AfterWriteEntry 类型的事件,该事件在编写每个条目后发生,如下所示:

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

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

【讨论】:

  • 但它的工作原理是基于条目的长度而不是大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多