呼び出しから更新されている進行状況バーを持つ 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 分の 1 しか上がりません。
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;
}
しかし、これでも予期しない結果が得られます。転送されるバイト数が合計バイト数よりもはるかに多いようです。
ファイルごとに new を使用することと関係があるとしか思えませんmyCallback
が、今は本当に行き詰まっています。
どんな助けでも本当に感謝しています。