使用StreamWriter对象后,为什么我的文本文件不完整?

Gre*_*SAT 6 powershell streamwriter

我写了一个小程序,生成大文本文件.我发现使用StreamWriter比我知道的其他方法快得多.但是每个文本文件的末尾都缺失了.

我将程序缩减为一个非常简单的片段来发现问题,但我仍然无法理解如何解决它.

#$stream = [System.IO.StreamWriter] "test.txt"
# also tested with  $stream = New-Object System.IO.StreamWriter("test.txt")

$i = 1
while($i -le 500) {
    $stream.WriteLine("$i xxxxxx")
    $i++
}
$stream.flush        # flushing don't change anything
$stream.close        # also tested with   $stream.dispose

exit 0
Run Code Online (Sandbox Code Playgroud)

问题1:
文件末尾丢失.根据线长度,最后一行约为495,通常在线的中间切割.

问题2:
程序完成后,文本文件仍然被锁定(我们可以读取它,但不能删除/重命名).我们必须退出PowerShell才能获得对该文件的完全访问权限.

在Windows 2003和Windows 2008上测试,结果完全相同.

编辑
dugas发现了问题:我忘记了一些括号.哪个解决了我的代码片段显示的问题.
但我的原始程序有括号.所以我将这个问题标记为已解决,并且当我为这个特定问题找到更好的代码片段时,我会打开一个新问题.

编辑2
知道了.我有一个隐藏的例外.非常感谢 !

dug*_*gas 9

调用StreamWriter的方法时,您缺少括号:

更改:

$stream.close
Run Code Online (Sandbox Code Playgroud)

$stream.Close()
Run Code Online (Sandbox Code Playgroud)

您可能还想在try/finally中包装StreamWriter并在finally中调用Dispose:

try
{
 $stream = [System.IO.StreamWriter] "C:\Users\168357\Documents\test2.txt"
 $stream.WriteLine("xxxxxx")
}
finally
{
 if ($stream -ne $NULL)
 {
  $stream.Dispose()
 }
}
Run Code Online (Sandbox Code Playgroud)

  • @GregoryMOUSSAT - 我的猜测是在您的完整程序中,在您调用 Close 之前遇到异常。尝试使用 try/finally 看看是否能解决您的问题。 (2认同)