以下内容引发异常“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
中的内容?
答案 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对象的引用,它仍然存在。该对象可以进行垃圾收集,当发生这种情况时,文件将被关闭,但是没有预测垃圾收集何时发生。