【问题标题】:Why is File.Create needed to be closed?为什么需要关闭 File.Create?
【发布时间】:2011-05-20 13:04:23
【问题描述】:

以下抛出异常“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 中的哪些内容需要关闭?

【问题讨论】:

标签: c# .net


【解决方案1】:

File.Create 在这里做的比你想象的要多。它不仅仅是创建文件,它还向文件返回一个活动流。但是,您没有对该流进行任何操作。后一个示例中的 using 块通过处置它来关闭该流。

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

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

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

您的下一步,拨打File.WriteAllText 也比您想象的要多。根据the documentation,它:

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

因此,您的File.Create 电话似乎在这里并不真正需要。

【讨论】:

  • +1 提到它返回一个FileStream 并且是多余的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2018-03-22
          • 2021-11-06
          • 2012-12-03
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          • 2020-08-28
          相关资源
          最近更新 更多