Программа Visual Basic не выпускает ресурс - PullRequest
0 голосов
/ 22 декабря 2009

У меня есть программа, написанная на 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 ]

2 голосов
/ 22 декабря 2009

Чтобы избежать спецификации, необходимо указать кодировку, в которой ее нет, используйте 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 голос
/ 22 декабря 2009

Итак, я нашел проблему, но не знаю, почему она там есть.

3 дополнительных двоичных символа вставляются в начало файла .conf при его записи.

Это: ï »hex, hex EF BB BF. Я понятия не имею, откуда они.

Есть идеи?

Кроме того, извините за путаницу с VB6 / VB.NET. Я был не прав.

Спасибо, B.J.

0 голосов
/ 22 декабря 2009

Вы должны использовать System.IO.File вместо My.Computer.FileSystem

0 голосов
/ 22 декабря 2009

Вполне возможно, что эта проблема вызвана чем-то, не связанным с доступом к файлу - я думаю, что первая точка присоединения - это проверить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...