我有一个带有进度条的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
有关,但现在我真的卡住了。
任何帮助都会非常感激。
答案 0 :(得分:2)
通过针对简单案例进行测试,找出算法中的缺陷。假设一个包含4个字节的文件,并报告每个字节的进度。因此,您将获得4次回调,其中totalBytesTransferred为1,2,3和4.现在您将它们添加到bytesCopied,因此您将添加总共10个字节。对于只有4个字节的文件。
显然这是错的。您需要等到CopyFileEx()完成后再然后将文件大小添加到bytesCopied。这确实需要您跟踪所有文件大小,这是您想要避免的并且让您陷入麻烦。