为什么需要关闭File.Create?

32

下面的代码会抛出异常 "The process cannot access the file 'D:\MyDir\First.txt' because it is being used by another process."

static void Main(string[] args)
{
    Directory.CreateDirectory(@"D:\MyDir");
    File.Create(@"D:\MyDir\First.txt");
    File.WriteAllText(@"D:\MyDir\First.txt", "StackOverflow.com");
}

但是以下代码可以正常工作:

using (File.Create(@"D:\MyDir\First.txt"))
{ 
}
或者
File.Create(@"D:\MyDir\First.txt").Close();

为什么?File.Create中的哪个部分需要关闭?


可能是重复的问题:在使用File.Create()后文件被另一个进程占用 - bluish
5个回答

47

File.Create的作用不仅仅是创建文件,它还返回一个对该文件的活动流。然而,您没有使用该流。您后面示例中的using块通过处理流来关闭并释放它。

请注意,这也是有关返回值的重要提示:

File.Create(@"D:\MyDir\First.txt").Close();

一开始我看到你的问题时并没有完全明白,但回过头来看这行代码,它实际上已经说得很清楚了。

接下来调用File.WriteAllText方法所做的事情也比你想象的要多。根据文档中的说明,它会:

创建一个新文件,在文件中写入指定的字符串,然后关闭文件。

因此,在这里似乎并不需要调用File.Create方法。


5
感谢您提到返回了一个 FileStream 并且是多余的。+1(表示同意或赞成) - Richard Marskell - Drackir

22
因为它打开了一个文件流,这是一个管理某些操作系统低级资源的类,这些资源必须被释放,以便其他线程甚至其他应用程序可以访问该文件。

11
您实际上不需要调用 File.Create() 方法才能调用 File.WriteAllText() 方法。 File.WriteAllText() 方法会创建一个新文件并将文本写入该文件,然后关闭该文件,这一切都在一个方便的方法中完成。
如果文件已经存在,则会被覆盖。

10

MSDN文档中有关File.Create()的说明如下:

该方法创建的FileStream对象具有默认的FileShare值None;在原始文件句柄关闭之前,没有其他进程或代码可以访问所创建的文件。

基本上,在文件创建被关闭之前,其他进程不能访问该文件(在这种情况下为尝试写入该文件)。


8

File.Create(string) 返回一个持有文件打开的 FileStream 对象。即使您没有在变量中保留对 FileStream 对象的引用,它仍然存在。该对象可被垃圾回收,当发生垃圾回收时,文件将被关闭,但无法预测何时进行垃圾回收。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接