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

在.Net中使用File.CreateText()也会锁定文件,为什么?,.net,locking,filewriter,.net,Locking,Filewriter,我使用CreateText方法在“App1”中创建一个空文件(如下所示)。然后试图让另一个应用程序写入该文件,但失败了b/c它被锁定。直到我关闭“App1”它才被解锁 要解决此问题,我可以执行以下操作: Dim sw As StreamWriter = File.CreateText(path) sw.Close() 为什么调用CreateText会锁定文件?是否有一些隐式streamwriter或filewriter或正在创建的内容 tep是的,创建了StreamWriter。看见我建议让第

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

要解决此问题,我可以执行以下操作:

Dim sw As StreamWriter = File.CreateText(path)
sw.Close()
为什么调用CreateText会锁定文件?是否有一些隐式streamwriter或filewriter或正在创建的内容


tep

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

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


如果忽略返回值,则
StreamWriter
会挂起,保留在文件上。您确实需要像在第二段代码中那样处理它

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

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module
CreateText()
创建文件,然后返回
StreamWriter
,以便在需要时继续写入文件


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

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

File.WriteAllBytes(path, new byte[0]);
是否有一些隐含的streamwriter或 filewriter或正在创建的东西

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

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

File.CreateText(path).Close()
编辑


测试并确认工作正常。

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

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

File.CreateFile通过StreamWriter调用FileStream构造函数,并传递FileMode.Create、FileAccess.Write和FileShare.Read。这是创建、访问和共享文件的一种非常正常的方式。因为您刚刚创建了文件,所以您肯定需要写访问权限。当你在写文件的时候,其他进程读取文件是可以的,当它们这样做的时候,没有什么不好的事情发生

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

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


也许您想做一些事情,比如故意不自己写入文件,这样就不会发生这种情况。这是非常不寻常的,但可以让它发挥作用。更大的问题是另一个进程要检测文件是否存在。如果让其他进程来创建文件,一切可能都会更好。

再次搜索后,我发现了一个相关的Stackoverflow问题:哦,天哪,这让我们在很长一段时间内都被一个讨厌的bug害死了。我们使用互斥体并检查异常以防运气不佳,这只是因为我们没有处理StreamWriter。。。
Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using