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);

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が、今は本当に行き詰まっています。

どんな助けでも本当に感謝しています。

4

1 に答える 1

2

単純なケースに対してアルゴリズムをテストして、アルゴリズムの欠陥を見つけます。ファイルが 4 バイトで、進行状況がバイトごとに報告されるとします。したがって、1、2、3、および 4 の totalBytesTransferred でコールバックを 4 回取得します。現在、これらを bytesCopied に追加しているので、合計 10 バイトを追加します。わずか 4 バイトのファイルの場合。

明らかにそれは間違っています。CopyFileEx() が完了するまで待ってから、ファイル サイズを bytesCopied に追加する必要があります。そのためには、すべてのファイル サイズを追跡する必要があります。

于 2013-01-18T20:53:45.547 に答える