【发布时间】:2013-01-19 04:53:45
【问题描述】:
我有一个带有进度条的 Winform,它正在通过 CopyFileEx 调用进行更新。
我的回调函数(我认为是问题所在)是
CopyFileCallbackAction myCallback(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred)
{
double dProgress = ((double)totalBytesTransferred / byteCount) * 100.0;
backupWorker.ReportProgress((int)dProgress);
return CopyFileCallbackAction.Continue;
}
我调用使用CopyFileEx 的函数是(我认为CopyFileEx 包装器与问题无关,所以我没有发布它)
FileRoutines.CopyFile(new FileInfo(source), new FileInfo(dest), CopyFileOptions.All, myCallback);
byteCount 是 long 要复制的所有文件的总大小。
如果我只复制 1 个文件,它可以完美运行,但是当我开始复制多个文件时问题就开始了。
每当复制一个文件时,进度条的值都会重置回 0,因此当所有内容都复制完毕时,显示的唯一进度是最后一个文件的百分比,所以如果文件的总和为 10MB,并且有是 5 个 2MB 的文件,进度条只上升了 5 分之一。
我想我可以通过将totalBytesTransferred 添加到另一个静态变量来解决这个问题,就像这样
public static long bytesCopied = 0;
CopyFileCallbackAction myCallback(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred)
{
bytesCopied += totalBytesTransferred;
double dProgress = ((double)bytesCopied / byteCount) * 100.0;
backupWorker.ReportProgress((int)dProgress);
return CopyFileCallbackAction.Continue;
}
但我也得到了意想不到的结果。似乎正在传输的字节数远远超过总字节数。
我只能假设它与为每个文件使用新的 myCallback 有关,但现在我真的卡住了。
任何帮助将不胜感激。
【问题讨论】:
-
你的进度条是在哪里声明的?
-
只是设计师制作的。
-
您的回调是否每次都创建一个新实例?
-
嗯,这实际上是有道理的。您在每次回调时更新进度条,而不是计算每个文件的进度。
标签: c# progress-bar