2009-12-22 119 views
0

我有一个用VB.NET编写的程序,它停止使用文件x,修改x并重新启动服务的服务。Visual Basic程序不释放资源

我修改了我的测试代码,以便它只是以字符串的形式读取文件并立即将其写回。

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文件扩展名。我不知道这是否相关。

有什么建议可能会导致此行为?

感谢,

BJ

+1

也许值得考虑通过你的事件日志看看,看看,如果服务一直困扰着报告为什么它无法重新启动。 – Xav 2009-12-22 14:51:09

+0

这可能是由于文件资源未被释放而导致错误的轨道,但再次打开,保存和关闭文件会使所有内容正常工作。 – Benny 2009-12-22 14:52:22

+0

这不是VB6代码的外观 - 它是VB.net – 2009-12-22 14:56:32

回答

2

为了避免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 
+0

是的,这是答案。该服务不知道如何正确读取UTF8编码的文件。 – 2009-12-22 21:24:55

0

这是完全可能的,这种问题是由对文件访问的东西无关所致 - 我认为附上的第一点是检查事件日志时从服务的错误消息,和/或在调试器中运行脚本,并检查文件是否在服务启动调用之前真正锁定。

这就是说,如果你正在使用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 
+0

仍然是一个没有去。将Nothing分配给tempFile不会改变行为。 感谢您的快速响应,但。 – Benny 2009-12-22 14:51:28

+0

对不起,但这不会推倒对象。这只是使它可用于垃圾收集器,可能不会在整个分钟内调用(这基本上是一个正在运行的程序)。 – 2009-12-22 14:55:45

+0

虽然他在讨论VB6 - 不是.Net? VB6是_not_垃圾收集 – Dexter 2009-12-22 14:55:51

1

所以,我发现了这个问题,但我不知道为什么它的存在。

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

它们是:ï¿¿,六角EF BB BF。我不知道他们来自哪里。

任何想法?

此外,对于VB6/VB.NET混淆抱歉。我错了。

谢谢, B.J.

+0

这就是BOM(字节顺序标记)http://en.wikipedia.org/wiki/Byte_order_mark – 2009-12-22 15:26:33

+0

确实。看起来默认的文本编码是UTF-8,所以当文本被写入时,BOM已经被预先占用。它看起来像使用该文件的程序无法解释它,所以服务停止。我不得不向StreamWriter声明添加一个文本编码参数来指定ASCII编码,并解决了这个问题。 感谢您的全力帮助。 – Benny 2009-12-22 15:40:54

+0

使用System.Text.Encoding.Default而不是System.Text.Encoding.ASCII,后者将在7位屏障上丢失字符。 – 2009-12-22 16:02:50