我正在使用CreateText方法在“App1”中创建一个空文件(如下所示)。然后尝试让另一个应用程序写入该文件,但它失败了b / c它被锁定了。直到我关闭“App1”
才解锁File.CreateText(path)
要解决此问题,我可以这样做:
Dim sw As StreamWriter = File.CreateText(path)
sw.Close()
为什么只调用CreateText会锁定文件?是否有一些隐含的编写器或文件写入器或正在创建的东西?
tep
答案 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