我正在寻找类似于具有这样签名的东西:
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:我们可以假设在执行此代码时不会从目录中删除文件。