仅在不存在的情况下创建文件

时间:2011-10-24 07:58:52

标签: c# .net io

我想创建一个文件,如果它尚不存在。
代码如:

if (!File.Exists(fileName))
{
    fileStream fs = File.Create(fileName);
}

如果在“if”和“create”之间创建文件,请将其保留为竞争条件。

我该如何避免呢?

编辑:
locks 不能在这里使用,因为它是一个不同的进程(同一个应用程序的多个实例)。

5 个答案:

答案 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一起使用。如果该文件存在,它只是使用它,否则它只是创建它。