TextStream.AtEndOfStream иногда никогда не бывает правдой - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть скрипт vb, который обрабатывает текстовые файлы на сервере, однако, очень редко, без видимой причины, скрипт застревает в цикле.

Файлы загружаются клиентами через ftp (небольшая около 2 - 10 кб), служба .Net, которая наблюдает за папкой ftp, запускает исполняемый файл (написанный на VB6), исполняемый файл перемещает файл из папки ftp в папку папка, где это обрабатывается. В этот момент exe запускает скрипт vb. 98% времени сценарий выполняется без проблем.

Когда происходит бесконечный цикл, я прекращаю процесс exe. Странно то, что когда я запускаю процесс вручную (копируя его обратно в папку, которую просматриваем), тот же самый файл проходит без проблем.

Короче говоря, сценарий открывает файл в текстовом потоке, затем он перебирает объект TextStream, пока его свойство AtEndOfStream не станет равным true. Внутри цикла он создает новый файл с добавлением некоторой дополнительной информации, теперь, когда возникает ситуация бесконечного цикла, временный файл не содержит никаких данных исходного файла, только дополнительные данные, добавленные сценарием, например, следующий код работает на 98% времени:

Do While ts.AtEndOfStream <> True
    sOriginalRow = ts.ReadLine
    sUpdatedRow = sOriginalRow & ",Extra_Data"
    NewFile.WriteLine sUpdatedRow
Loop

Так что, если исходный файл содержит:

Linea
LineB
LineC

Создан новый файл, содержащий:

Linea, Extra_Data
LineB, Extra_Data
LineC, Extra_Data

но когда возникает проблема и новый файл мгновенно заполняется тысячами строк

, Extra_Data
, Extra_Data
, Extra_Data
, Extra_Data
, Extra_Data
...

как будто свойство AtEndOfStream никогда не становится истинным.

Сначала я думал, что исходный файл как-то поврежден, но когда эти исходные файлы перерабатываются, они в порядке. Другая мысль состоит в том, что объект texttream создается неправильно и не получает символ новой строки, возможно, из-за того, что файл заблокирован другим процессом или чем-то еще.

Единственный способ, который я нашел для репликации поведения, - это закомментировать часть кода ReadLine, которая фактически предотвращает увеличение номера текущей строки. например, * * тысяча тридцать три

sOriginalRow = "" 'ts.ReadLine

Может кто-нибудь предложить какие-либо предложения?

1 Ответ

1 голос
/ 22 февраля 2011

Ну, как вы говорите, единственное, что я могу предложить, это предложения, а не реальные ответы:

Возможно, ваш поток сталкивается с ObjectDisposedException (не перехватывается в VBScript), поэтому условие EndOfStream получает <> True, но не False.

Ради эксперимента вы можете попытаться изменить Do While ts.AtEndOfStream <> True на Do While Not ts.AtEndOfStream или Do Until ts.AtEndOfStream, но мои биологические схемы говорят мне, что, вероятно, это не сработает.

Существует еще одна проблема, описанная , когда stdIn и stdErr конфликтуют друг с другом, вызывая зависание в определенных ситуациях.

Не могли бы вы также ответить на комментарий Tmdean. При ошибке Resume Next может создать настоящий беспорядок: если ts.AtEndOfStream вернет Null или мусор (потому что ts был уничтожен, например), он не станет True и вызовет цикл в Foreverland.

...