System.IO.File.Create 锁定文件

61

我正在使用System.IO.File.Create创建文件。 我没有使用流编写器进行写入,只是创建了它。

当应用程序尝试打开新创建的文件时,前端会出现服务器错误-即文件正在使用中。 然后垃圾回收似乎会在几分钟后将所有内容都清理掉。

现在我知道如果我使用Streamwriter,我必须关闭它。 创建文件是否也适用此规则?

我已经阅读到,打开一个StreamWriter到文件然后立即关闭它可以解决这个问题,但这似乎很麻烦。 是否有更简单的方法?

6个回答

121

试一下这个:

System.IO.File.Create(FullFName).Close();

1
这非常适合当你只想创建一个空白文件的时候。 - TTT
1
太对了!“我没有使用流编写器来写入它,只是创建它。” - Víctor Velarde
这正是我一直在寻找的。对于空文件来说非常有效。谢谢。 - Louis van Tonder
19
这不是什么大问题,但这违反了一次性使用模式。我会将Close()替换为Dispose()(Dispose()也会调用Close)。 - TamusJRoyce
我会用Dispose()替换Close(),或者更好的方法是使用using语句。 - phoenix

84

File.Create 返回一个 FileStream。你应该这样使用它:

using (FileStream fs = File.Create(path))
{
    //you can use the filstream here to put stuff in the file if you want to
}

2
我从未想过这会发生。 - ASA
1
是的,我们都这样认为。但是 using 语句不起作用,即使我在结尾处加上 fs.Close() 也不行。文件仍然挂起。我正在使用 .NET 4.6.1。 - Dag

12

创建该文件会打开一个FileStream,从而将其锁定(File.Create返回FileStream)。

您必须关闭此流才能访问该文件。最好使用using语句完成此操作:

using(FileStream fs = File.Create(path))
{
}

9
当使用File.Create时,会返回一个FileStream。在你关闭流或FileStream对象被垃圾回收器的终结器处理之前,它将保持打开和锁定状态。 FileStream实现了IDisposable接口,因此可以执行以下操作:
using(FileStream fs = File.Create(filename))
{
    // Do stuff like write to the file
}
using语句是一种“语法糖”,它会导致编译器生成与以下代码在功能上等效的代码:
FileStream fs = File.Create(filename)
try
{
    // Do stuff like write to the file
}
finally
{
    fs.Dispose();
}
Dispose 方法会在内部调用 Close 方法。

3

我之前使用的是:System.IO.File.Create(sFullFileName);

上述的.Create方法没有关闭文件。

现在我使用:System.IO.File.WriteAllText(sFullFileName, "上传中");

这种方法会创建并关闭文件(注意:我在文件中放了一个字符串“上传中”,但我相信string.Empty也可以工作)。


1

Create 方法将返回一个文件句柄。在重新使用该文件之前,应关闭文件句柄。请参阅 MSDN 文章 File.Create Method (String) 以获取详细信息。

摘要:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接