我有以下代码用于单个文件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个子文件夹的一个文件夹。
但是我想知道是否有任何方法可以正确显示文件夹压缩的进度条?
答案 0 :(得分:3)
这是因为“e.BytesTransferred”是传输每个条目的字节数而不是总数。
“此条目到目前为止读取或写入的字节数。”
我自己犯了同样的错误:)(虽然我用它来提取文件)
答案 1 :(得分:2)
在@Shazi answer的基础上,一个解决方案是依赖于在写完每个条目之后发生类型Saving_AfterWriteEntry
的事件:
if(e.EventType == ZipProgressEventType.Saving_AfterWriteEntry)
{
this.progressbar1.Value = e.EntriesSaved * 100 / e.EntriesTotal;
}
这种解决方案的问题在于它将大文件视为小文件,因此进度条在不同时间具有不同的进度速度(取决于文件大小之间的差异)。