7

のドキュメントからFile.Move

同じ名前のファイルをそのディレクトリに移動してファイルを置き換えようとすると、IOExceptionが発生することに注意してください。Moveメソッドを使用して既存のファイルを上書きすることはできません。

つまり、で上書きすることはできないMoveため、Moveでの上書きを容易にするために、File.Copyその後に。を実行することで動作を模倣しFile.Deleteます。何かのようなもの:

if (File.Exists(dstFileName))
{
    // System.IO.File.Move cannot be used to overwrite existing files, so we're going
    // to simulate that behavior with a Copy & Delete.
    File.Copy(procContext.FileName, dstFileName);
    File.Delete(procContext.FileName);
}
else
    File.Move(procContext.FileName, dstFileName);

私の質問は次のとおりです。最初に正常にコピーされないままソースファイルが削除される可能性がある状況を防ぐ必要がありますか?

ドキュメントを読んだ私の理解は、File.Copy何も返さないので、成功しなかった場合に例外をスローする必要があるということです。これが当てはまらない状況に遭遇した人はいますか?

4

5 に答える 5

9

最初にターゲットファイルが存在するかどうかを調べ、存在する場合は削除することをお勧めします。次に、通常の移動操作を実行します。

このシーケンスはアトミックではないため、宛先が存在する場合は、移動が失敗した場合に失われないように、削除するのではなく名前を変更することをお勧めします。

于 2012-04-24T20:16:27.723 に答える
7

それを行う正しい方法は、呼び出すことです

File.Replace(source, destination, copy)

それは私のためのトリックを行います

于 2014-02-19T14:11:48.070 に答える
4

オペレーティング システムが優れたアトミック操作を提供しない場合、アトミック操作をシミュレートすることは困難です。 Moveすべてではありませんが、一部のファイルシステムではアトミックですが、ディスクからディスクに移動する場合はアトミックではありません。

同じディスクの場合、Delete+Moveは実際にはデータを詰め込まないため、ややエレガント (高速で安全) です。さらに拡張することができます

try
{
    Move(dest, tmp);
    Move(src, dest);
    Delete(tmp);
}
catch
{
    try
    {
        Move(tmp, dest);
    }
    catch
    {
    }
    throw;
}

(これにより、移動を完了するために必要な権限がない場合などに、移動先のファイルを失う可能性が低くなります。)

同じディスクであることがわからないシナリオでは、ソリューションは十分に安全でシンプルです。ただし、同じディスク内であってもデータをコピーするため、電源障害のリスクの幅が広がります。

于 2012-04-24T20:24:16.400 に答える
2

これは安全です。File.Copy は完全に成功するか、スローされます。もちろん、ソース ファイルをガベージとして残して、削除に失敗する可能性があります。

ただし、コンピューターがクラッシュした場合、コピー操作によってデータが強化されているという保証はありません。その場合、データが失われる可能性があります。

通常の操作中は安全です。

于 2012-04-24T20:07:31.513 に答える
0

ファイル「ターゲット」が存在するかどうかを確認します。いいえの場合は、ファイルをコピーします。

「はい」の場合: 「ターゲット」を一時ディレクトリに移動します。移動が成功することが確実な場所です。UUID という名前で Temp にサブディレクトリを生成できます。次に、ファイルをコピーします。

于 2012-04-24T20:26:53.497 に答える