进度条值重置

时间:2013-01-18 19:49:56

标签: c# progress-bar

我有一个带有进度条的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有关,但现在我真的卡住了。

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

通过针对简单案例进行测试,找出算法中的缺陷。假设一个包含4个字节的文件,并报告每个字节的进度。因此,您将获得4次回调,其中totalBytesTransferred为1,2,3和4.现在您将它们添加到bytesCopied,因此您将添加总共10个字节。对于只有4个字节的文件。

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