【问题标题】:Progress Bar value getting reset进度条值被重置
【发布时间】: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);

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

如果我只复制 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


【解决方案1】:

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

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

【讨论】:

  • 谢谢汉斯,这很有意义! CopyFileEx 在什么时候实际完成,所以我可以将文件大小添加到 bytesCopied?如果有帮助,我可以发布我正在使用的包装器,谢谢。
  • 返回时完成。我在这里踢了太多敞开的门。
  • 对不起,我刚刚意识到你已经在你的回答中说过了。我设法通过按照您的建议在每次调用后添加每个文件的文件大小来修复它,它运行良好,非常感谢,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
相关资源
最近更新 更多