为什么需要关闭文件创建

本文关键字:文件创建 为什么 | 更新日期: 2023-09-27 17:56:57

以下抛出异常" 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在这里做的比你想象的要多。 它不仅仅是创建文件,它还向文件返回活动流。 但是,您没有对该流执行任何操作。 后一个示例中的using块通过释放该流来关闭该流。

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

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

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

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

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

因此,无论如何,这里似乎都不需要您的File.Create电话。

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

您实际上不需要调用File.Create()就可以调用File.WriteAllText()

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

如果文件已存在,它将被覆盖。

File.Create() 的 MSDN 文档对此进行了解释:

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

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

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