我有一个vb脚本来处理服务器上的文本文件,但是,偶尔没有任何明显的原因,脚本会陷入循环中。
客户端通过ftp(小型约2 - 10 kb)上传文件,一个.Net服务正在观看ftp文件夹启动可执行文件(用VB6编写),可执行文件将文件从ftp文件夹移动到处理它的文件夹。此时exe将启动vb脚本。 98%的时间脚本运行没有问题。
当无限循环发生时,我终止了exe进程。奇怪的是,当我手动重新启动过程(通过将其复制回正在被监视的文件夹)时,它完全相同的文件没有问题。
简而言之,脚本将文件打开为文本流,然后循环遍历TextStream对象,直到其AtEndOfStream属性为true。在循环中,它创建了一个新文件,其中添加了一些附加信息,现在无论何时出现infinate循环情况,临时文件都不包含任何源文件数据,只是脚本添加的额外数据,例如,以下代码工作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
属性永远不变为真。
我最初的想法是源文件以某种方式被破坏但是当这些源文件被重新处理时它们没问题。另一个想法是文本流对象被错误地创建,而不是拾取新行字符,可能是因为该文件被另一个进程或其他东西锁定。
我发现复制行为的唯一方法是注释掉代码的ReadLine部分,这实际上阻止了当前行号的递增。 e.g。
sOriginalRow = "" 'ts.ReadLine
有人可以提出任何建议吗?
答案 0 :(得分:1)
嗯,正如你所说,我唯一可以提供的是建议,而不是真正的答案:
也许你的流碰到ObjectDisposedException(在VBScript中无法捕获),因此EndOfStream条件得到&lt;&gt;是的但不是假的。
为了实验,您可以尝试将Do While ts.AtEndOfStream <> True
更改为Do While Not ts.AtEndOfStream
或Do Until ts.AtEndOfStream
,但我的生物逻辑电路告诉我可能无法正常工作。
还有另一个problem described,其中stdIn和stdErr相互冲突导致在特定情况下挂起。
你能回答一下Tmdean的评论吗? On Error Resume Next可以创建一个真正的混乱:如果ts.AtEndOfStream返回Null或者垃圾(因为ts被破坏了),它将不会变为True并且将在Foreverland中引起循环。