为什么需要关闭File.Create?

Kan*_*ang 31 .net c#

以下引发异常" 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");
}
Run Code Online (Sandbox Code Playgroud)

以下作品:

using (File.Create(@"D:\MyDir\First.txt"))
{ 
}
Run Code Online (Sandbox Code Playgroud)

要么

File.Create(@"D:\MyDir\First.txt").Close();
Run Code Online (Sandbox Code Playgroud)

为什么?什么File.Create需要关闭?

Dav*_*vid 45

File.Create比你想象的要多得多.它不仅仅是创建文件,它还将活动流返回到文件.但是,您没有对该流做任何事情.using后一个示例中的块通过处理它来关闭该流.

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

File.Create(@"D:\MyDir\First.txt").Close();
Run Code Online (Sandbox Code Playgroud)

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

你的下一步,打电话File.WriteAllText也比你想象的要多.根据文件,它:

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

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

  • +1提到它返回一个`FileStream`并且是多余的. (5认同)

Mat*_*zer 22

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


Dan*_*plo 10

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

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

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


Kev*_*Kev 10

你实际上不需要打电话File.Create()就可以打电话File.WriteAllText().

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

如果该文件已存在,则将被覆盖.


Jef*_*dge 7

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