在.Net中使用File.CreateText()也锁定文件,为什么?

时间:2010-02-03 00:45:58

标签: .net locking filewriter

我正在使用CreateText方法在“App1”中创建一个空文件(如下所示)。然后尝试让另一个应用程序写入该文件,但它失败了b / c它被锁定了。直到我关闭“App1”

才解锁
File.CreateText(path)

要解决此问题,我可以这样做:

Dim sw As StreamWriter = File.CreateText(path)
sw.Close()

为什么只调用CreateText会锁定文件?是否有一些隐含的编写器或文件写入器或正在创建的东西?

tep

8 个答案:

答案 0 :(得分:7)

是的。 CreateText()返回一个StreamWriter对象,该对象对您指定的文件开放。

如果你只是忽略了返回值,StreamWriter会挂起,保留你的文件。你真的需要在第二块代码中处理它。

答案 1 :(得分:5)

  

是否有一些隐含的写行者或   文件编写者或正在创建的东西?

创建StreamWriter,如您自己的代码所示。这就是为什么你可以将返回值赋给StreamWriter类型的变量。

这是我知道创建空文件的最简单方法:

File.CreateText(path).Close()

修改

经过测试并确认可以正常工作。

答案 2 :(得分:2)

CreateText()创建文件,然后返回StreamWriter,以便您可以根据需要继续写入文件。

要关闭文件,您必须显式关闭文件(如示例所示)。

答案 3 :(得分:1)

如果您需要没有流的空文件,请尝试以下操作:

File.WriteAllBytes(path, new byte[0]);

答案 4 :(得分:1)

File.CreateFile,通过StreamWriter,最终调用FileStream构造函数,传递FileMode.Create,FileAccess.Write和FileShare.Read。这是创建,访问和共享文件的一种非常正常的方式。您刚刚创建文件时,您肯定需要写访问权限。对于其他进程来说,在编写文件时读取文件是可以的,当它们发生时没有什么不好的。

您要求的是可能的,但您不能使用File.CreateFile()。您必须首先创建一个FileStream(Create,Write和FileShared.ReadWrite),然后将其传递给StreamWriter构造函数。现在,文件可以由您和另一个进程编写。

这是相当棘手的,假设您和其他一些进程同时写入文件。这是先到先得,文件将最终包含您的程序输出,随机混合其他进程的输出。在发生这种情况之后,文件不太可能是可读的。

也许你想做一些故意不自己写文件的事情,所以这不会发生。这是非常不寻常的,但可以使它工作。然后更大的问题是其他进程检测文件是否存在。如果您只是将其留给另一个进程来创建文件,那么一切都可能会更好。

答案 5 :(得分:0)

是的,创建了一个StreamWriter。见the docs。我建议让第一个程序写入文件创建它。

答案 6 :(得分:0)

我认为最简单的解决方案是创建一个包装函数,为您创建和关闭。

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module

答案 7 :(得分:0)

一旦调用close,您需要将StreamWriter封装在using块中以将其范围限定。这将导致它调用它的dispose(关闭它),然后取消它作为参考链接并将其“发送”到GC。

Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using