0

我有一个带有进度条的 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);

byteCountlong要复制的所有文件的总大小。

如果我只复制一个文件,它可以完美运行,但是当我开始复制多个文件时问题就开始了。

每当复制一个文件时,进度条的值都会重置回 0,因此当所有内容都复制完毕时,显示的唯一进度是最后一个文件的百分比,所以如果文件的总和为 10MB,并且有 5 个 2MB文件,进度条只上升了五分之一。

我想我可以通过添加另一个静态变量来解决这个问题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为每个文件使用新文件有关,但现在我真的被卡住了。

任何帮助将非常感激。

4

1 回答 1

2

通过针对简单案例进行测试来发现算法中的缺陷。假设一个文件有 4 个字节,每个字节都会报告进度。因此,您将在 1、2、3 和 4 处使用 totalBytesTransferred 获得 4 次回调。现在您将它们添加到 bytesCopied,因此您将总共添加 10 个字节。对于只有 4 个字节的文件。

显然这是错误的。您需要等到 CopyFileEx() 完成,然后将文件大小添加到 bytesCopied。这确实需要您跟踪所有文件大小,这是您想要避免并让您陷入困境的事情。

于 2013-01-18T20:53:45.547 回答