我想创建一个文件,如果它尚不存在。
代码如:
if (!File.Exists(fileName))
{
fileStream fs = File.Create(fileName);
}
如果在“if”和“create”之间创建文件,请将其保留为竞争条件。
我该如何避免呢?
编辑:
locks 不能在这里使用,因为它是一个不同的进程(同一个应用程序的多个实例)。
答案 0 :(得分:21)
您也可以使用
FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);
但是,您应该查看线程锁定,就像多个线程尝试访问该文件一样,您可能会遇到异常。
答案 1 :(得分:13)
Kristian Fenn回答几乎是我所需要的,只是使用不同的FileMode。这就是我想要的:
FileStream fs = new FileStream(fileName, FileMode.CreateNew);
答案 2 :(得分:2)
这不是更好的解决方案。另请注意using(var stream...)
使用它关闭流以避免IO例外。
if (!File.Exists(filePath))
{
using (var stream = File.Create(filePath)) { }
}
答案 3 :(得分:0)
如果竞争尝试创建文件的过程相同,则可以在代码周围使用lock
语句来防止争用。
如果没有,当您调用File.Create时,可能偶尔会出现异常。只是妥善处理该异常。即使您在文件存在时处理异常,因为抛出的异常相对昂贵,因此建议在创建之前检查文件是否存在是可取的。只有在竞争条件的概率很低的情况下才是可取的。
答案 4 :(得分:0)
首先使用Lock或Monitor.Enter或TryEnter API来锁定代码部分。 其次,您可以将FileStream API与FileMode.OpenOrCreate API一起使用。如果该文件存在,它只是使用它,否则它只是创建它。