为什么需要关闭File.Create?

时间:2011-05-20 13:04:23

标签: c# .net

以下内容引发异常“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中的内容?

5 个答案:

答案 0 :(得分:45)

File.Create的效果超出了您的想象。它不仅仅是创建文件,它还将活动流返回到文件。但是,您没有对该流做任何事情。后一个示例中的using块通过释放它来关闭该流。

另请注意,这是关于返回值的重要线索:

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

(当我第一次阅读你的问题时,这对我来说实际上并不直观,但回过头来看,这行代码实际上就说明了一切。)

下一步,拨打File.WriteAllText也比您想象的要多。根据{{​​3}},它:

  

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

所以看来你的File.Create电话似乎并不是真正需要的。

答案 1 :(得分:22)

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

答案 2 :(得分:10)

File.Create()的MSDN文档解释了这一点:

  

由此创建的FileStream对象   method具有默认的FileShare值   无;没有其他流程或代码可以   访问创建的文件,直到   原始文件句柄已关闭。

基本上,在关闭文件创建之前,另一个进程无法访问该文件(在这种情况下,您尝试写入该文件)。

答案 3 :(得分:10)

您实际上不需要致电File.Create()然后可以致电File.WriteAllText()

File.WriteAllText()将创建一个新文件并写入,然后用一个方便的方法关闭文件。

如果文件已存在,则会被覆盖。

答案 4 :(得分:7)

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