【发布时间】:2015-09-28 12:35:33
【问题描述】:
我仅在文件存在时才尝试打开FileStream,否则执行其他操作(不创建它,因此FileMode.OpenOrCreate 不适用)。
但是,在创建FileStream 之前简单地检查File.Exists 不会阻止竞争条件,因为可以在FileStream 有机会创建之前删除文件,在这种情况下会抛出FileNotFoundException。
有没有办法“本地”实现这一点,而无需使用以下 try catch 包装器:
/// <returns>false if the file does not exists, true otherwise.</returns>
public static bool TryOpenFileStreamIfExists(string filePath, FileAccess fileAccess, FileShare fileShare, out FileStream fs, FileOptions fileOptions = FileOptions.None) {
try {
if (!File.Exists(filePath)) {
fs = null;
return false;
}
fs = new FileStream(filePath, FileMode.Open, fileAccess, fileShare, short.MaxValue, fileOptions);
return true;
}
catch (FileNotFoundException) {
fs = null;
return false;
}
}
【问题讨论】:
-
在这种情况下 try/catch 包装器有什么问题?
-
这似乎是一个合适的解决方案。 File.Exist 调用将处理大多数情况,而 catch 将处理异常情况。
标签: c# io filesystems race-condition