У меня есть скрипт 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
Может кто-нибудь предложить какие-либо предложения?