gpt4 book ai didi

c# - DotNetZip - 显示提取进度?

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:47 27 4
gpt4 key购买 nike

这个问题解决了。我的错误是在我的第二个代码块中,我使用的是 SaveProgress 而不是 ExtractProgress,并且在设置事件处理程序之前我使用的是 Zip.ExtractAll。感谢Bradley Moorfield感谢帮助我。

所以我在整个代码中使用 DotNetZip 库来压缩/提取 zip 文件。我能够使用此代码完成显示压缩百分比:

                using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(filePath);
var mb = GetDirectorySize(filePath) / 1048576;
long timesRunNeeded = mb / 100;
if (mb % 100 > 0) { timesRunNeeded++; }
if (mb <= 100) { timesRunNeeded = 1; }
int timesRun = 1;
int pastP = 0;
zip.SaveProgress += (o, args) =>
{
var percentage = (int)(1.0d / args.TotalBytesToTransfer * args.BytesTransferred * 100.0d);
if (pastP != percentage)
{
clearLine();
setColor(ConsoleColor.Gray); Console.Write(" Percentage: "); setColor(ConsoleColor.Green);
Console.Write(percentage + " [" + timesRun + "/" + timesRunNeeded + "]");
if ((percentage == 100) && (pastP >= 0) && (pastP <= 99))
{
timesRun++;
}
}
pastP = percentage;
};
zip.Save(filePath + ".zip");
}

之所以这样是因为它一次压缩 100 MB,例如,如果一个文件夹是 2153 MB,它会达到 100% 22 次。这一切都完美无缺,我喜欢我拥有它的方式,但是我在显示从 zip 解压缩到目录时完成的百分比时遇到了一些问题。到目前为止,这是我的代码:

                        using (ZipFile zip = ZipFile.Read(filePath))
{
Directory.CreateDirectory(filePath.Replace(".zip", ""));
zip.ExtractAll(filePath.Replace(".zip", ""), ExtractExistingFileAction.OverwriteSilently);
zip.SaveProgress += (o, args) =>
{ //Fix this, not showing percentage of extraction.
var percentage = (int)(1.0d / args.TotalBytesToTransfer * args.BytesTransferred * 100.0d);
clearLine();
Console.Write(percentage);
};
}

无论出于何种原因,此代码根本不打印任何百分比,所以我猜这与我实际计算百分比的方式有关。压缩和提取时应该有所不同吗?提前致谢。

最佳答案

您需要在开始提取之前添加事件处理程序。此外,SaveProgress 事件在保存期间触发,还有一个不同的处理程序,ExtractProgress 在提取期间触发。

See the reference for example usage (web.archive.org)

private static bool justHadByteUpdate = false;
public static void ExtractProgress(object sender, ExtractProgressEventArgs e)
{
if(e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten)
{
if (justHadByteUpdate)
Console.SetCursorPosition(0, Console.CursorTop);

Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer,
e.BytesTransferred / (0.01 * e.TotalBytesToTransfer ));
justHadByteUpdate = true;
}
else if(e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry)
{
if (justHadByteUpdate)
Console.WriteLine();
Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName);
justHadByteUpdate= false;
}
}

public static ExtractZip(string zipToExtract, string directory)
{
string TargetDirectory= "extract";
using (var zip = ZipFile.Read(zipToExtract)) {
zip.ExtractProgress += ExtractProgress;
foreach (var e in zip1)
{
e.Extract(TargetDirectory, true);
}
}
}

关于c# - DotNetZip - 显示提取进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com