私はこのような署名を持つものに似たものを探しています:
static bool TryCreateFile(string path);
これは、現在のユーザーが必要以上の権限を持っている必要なしに、スレッド、プロセス、さらには同じファイルシステムにアクセスする他のマシン間での潜在的な競合状態を回避する必要がありFile.Create
ます。現在、私は次のコードを持っていますが、特に好きではありません。
static bool TryCreateFile(string path)
{
try
{
// If we were able to successfully create the file,
// return true and close it.
using (File.Open(path, FileMode.CreateNew))
{
return true;
}
}
catch (IOException)
{
// We want to rethrow the exception if the File.Open call failed
// for a reason other than that it already existed.
if (!File.Exists(path))
{
throw;
}
}
return false;
}
私が見逃しているこれを行う別の方法はありますか?
これは、ディレクトリの「次の」シーケンシャルな空のファイルを作成してそのパスを返すように設計された次のヘルパーメソッドに適合し、スレッド、プロセス、さらには同じファイルシステムにアクセスする他のマシン間の潜在的な競合状態を回避します。したがって、有効な解決策には、これに対する別のアプローチが含まれる可能性があると思います。
static string GetNextFileName(string directoryPath)
{
while (true)
{
IEnumerable<int?> fileNumbers = Directory.EnumerateFiles(directoryPath)
.Select(int.Parse)
.Cast<int?>();
int nextNumber = (fileNumbers.Max() ?? 0) + 1;
string fileName = Path.Combine(directoryPath, nextNumber.ToString());
if (TryCreateFile(fileName))
{
return fileName;
}
}
}
Edit1:このコードの実行中は、ファイルがディレクトリから削除されないと想定できます。