Visual Basic程序不释放资源

时间:2009-12-22 14:45:04

标签: vb.net file file-io

我有一个用VB.NET编写的程序,它停止使用文件x的服务,修改x,然后重新启动服务。

我修改了我的代码进行测试,以便它只是将文件作为字符串读入并立即将其写回。

Shell("net stop " & SERVICE_NAME, , True)

Dim myReader As System.IO.StreamReader
myReader = My.Computer.FileSystem.OpenTextFileReader(x)
fileString = myReader.ReadToEnd()
myReader.Close()

Dim tempFile As System.IO.StreamWriter
tempFile = My.Computer.FileSystem.OpenTextFileWriter(x, False)
tempFile.Write(fileString)
tempFile.Close()

Shell("net start " & SERVICE_NAME, , True)

停止服务没有问题,修改文件没问题,但是当服务启动时它会立即停止,因为我可以猜测,文件正在使用中。即使我尝试手动启动服务,它也会立即停止。但是,我发现我可以打开文件x,单击保存而不修改任何内容,关闭文件,然后启动服务,一切正常。

如果我评论写作部分,一切正常。

此外,我正在修改的文件具有.conf文件扩展名。我不知道这是否相关。

有关可能导致此行为的建议?

谢谢,

B.J。

4 个答案:

答案 0 :(得分:2)

要避免BOM,您需要指定没有BOM的编码,请使用System.Text.Encoding.Default

My.Computer.FileSystem.WriteAllText("c:\test.txt", fileString, False, System.Text.Encoding.Default)

虽然这种方便方法很好,但我仍然喜欢手动创建一个FileStream对象,这样我就可以设置共享标志,确保没有人访问我的文件,直到我完成它:

    Using FS As New System.IO.FileStream("c:\test.txt", IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.None)
        Using SW As New System.IO.StreamWriter(FS, System.Text.Encoding.Default)
            SW.WriteLine(fileString)
        End Using
    End Using

答案 1 :(得分:1)

所以,我发现了问题,但我不知道为什么会这样。

在.conf文件的开头写入时会插入3个额外的二进制字符。

它们是:,hex EF BB BF。我不知道他们来自哪里。

有什么想法吗?

另外,抱歉VB6 / VB.NET混乱。我错了。

谢谢, B.J。

答案 2 :(得分:0)

这个问题完全可能是由与文件访问无关的东西引起的 - 我认为附加的第一点是检查EventLogs是否有来自服务的错误消息,和/或在调试器中运行脚本和在服务启动调用之前检查文件是否真正锁定。

那就是说,如果您使用VB.Net,我建议使用资源的正确方法是始终在using语句中:

Using tempFile = My.Computer.FileSystem.OpenTextFileWriter(x, False) as System.IO.StreamWriter
    tempFile.Write(fileSting)
    tempFile.Close()
End Using

如果这实际上是VB6(最初在问题中描述),那么你需要拆除文件对象,并释放内存(因为VB6不是垃圾收集,你需要明确地这样做)。将文件设置为Nothing应该释放文件上的锁:

Set tempFile = Nothing

答案 3 :(得分:0)

您应该使用System.IO.File代替My.Computer.FileSystem