3

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

File.CreateText(path)

为了解决这个问题,我可以这样做:

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

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

泰普

4

8 回答 8

7

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

如果您只是忽略返回值,那么它就会StreamWriter挂起,保留您的文件。您确实需要像在第二个代码块中那样处理它。

于 2010-02-03T00:49:01.630 回答
5

是否有一些隐式流写入器或文件写入器或正在创建的东西?

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

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

File.CreateText(path).Close()

编辑

测试并确认可以工作。

于 2010-02-03T01:23:46.110 回答
2

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

要关闭文件,您必须明确关闭文件(如您的示例中所示)。

于 2010-02-03T00:55:07.327 回答
1

如果你需要一个没有流的空文件,试试这个:

File.WriteAllBytes(path, new byte[0]);
于 2010-02-03T01:19:34.070 回答
1

您需要将 StreamWriter 包含在 using 块中,以便在调用 close 后将其范围。这将导致它调用它的 dispose(关闭它),然后将其作为引用取消链接并将其“发送”到 GC。

Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using
于 2010-02-03T01:24:35.400 回答
1

File.CreateFile 通过 StreamWriter 最终调用 FileStream 构造函数,传递 FileMode.Create、FileAccess.Write 和 FileShare.Read。这是创建、访问和共享文件的一种非常正常的方式。由于您刚刚创建了文件,因此您肯定需要写访问权。其他进程在您编写文件时读取文件是可以的,当他们这样做时不会发生任何真正的坏事。

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

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

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

于 2010-02-03T01:28:13.550 回答
0

是的,创建了 StreamWriter。请参阅文档。我建议让第一个写入文件的程序创建它。

于 2010-02-03T00:48:36.990 回答
0

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

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module
于 2010-02-03T00:54:24.460 回答