EBGreenのソリューションの改善点は、ファイルの存在を確認してファイルを作成するまでの競合状態を回避することです。
bool SafeMove(string sourceFilename, string destFilename)
{
for (int i = 0; i < RetryThreshold; ++i)
{
try
{
File.Move(sourceFilename, destFilename);
return true;
}
catch(IOException)
{
destFilename =
Path.GetFilenameWithoutExtension(destFilename) + i.ToString() +
Path.GetExtension(destFilename);
}
}
return false;
}
は、このコードのいくつかの問題があり、それはMove()
操作が失敗した後に再試行する試みを示しています。 IOExceptions
のすべてが再試行の理由を意味するわけではないので、よりスマートな例外処理を確実に実行する必要があります。また、エラー文脈を失うので、false
を返すことは賢明ではありません。
ディレクトリまたはファイル名の可読性に関心がない場合は、JPのファイル名にGuid
を追加するという解決策を使用してください。
これは、これを処理するための最良の方法です。それ以外の唯一の方法は、ファイルが存在するかどうかを知らせるExistというファイル上の関数があり、それが古いものを削除できる場合、最新のバージョンを使用したい場合です。 –
例では、ループカウンタをインクリメントしていません。 –
おっと...私は擬似機能コードを述べておくべきです。私はそれを修正します。ありがとう。 – EBGreen