我有一个vb脚本,用于处理服务器上的文本文件,但是,有时没有任何明显的原因,脚本会陷入循环。
文件由客户端通过ftp (大约2-10 kb)上传,这是一个.Net服务,它监视ftp文件夹启动一个可执行文件(用VB6编写),可执行文件将文件从ftp文件夹移动到一个处理它的文件夹。此时,exe将启动vb脚本。98%的脚本运行时没有问题。
当无限循环发生时,我将终止exe进程。奇怪的是,当我手动重新启动该进程(通过将它复制回正在监视的文件夹)时,它会完全相同,不会出现问题。
简而言之,脚本将文件打开为文本流,然后循环遍历TextStream对象,直到其AtEndOfStream属性为真为止。在循环中,它创建一个新文件,添加一些附加信息,现在每当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属性永远不会变成真一样。
我最初的想法是源文件在某种程度上被破坏了,但是当这些源文件被重新处理时,它们就没问题了。另一个想法是textstream对象被错误地创建了,并且没有选择新的行字符,这可能是因为文件被另一个进程锁定了。
我发现复制这种行为的唯一方法是注释掉代码的ReadLine部分,这实际上阻止了当前行号的递增。例如:
sOriginalRow = "" 'ts.ReadLine有人能提出建议吗?
发布于 2011-02-22 07:53:15
就像你说的,我唯一能提供的是建议,而不是真正的答案:
您的流可能与ObjectDisposedException (在VBScript中不可捕获)发生碰撞,因此EndOfStream条件得到<>为真,但不为假。
为了进行实验,你可以尝试将Do While ts.AtEndOfStream <> True改为Do While Not ts.AtEndOfStream或Do Until ts.AtEndOfStream,但我的生物逻辑电路告诉我,这可能行不通。
还有一个问题描述,其中stdIn和stdErr相互冲突,在特定情况下导致挂起。
请你也回答Tmdean的评论。在错误恢复时,下一步可能会造成真正的混乱:如果ts.AtEndOfStream返回空或垃圾(例如,由于ts被销毁),它将不会变成True,并将导致Foreverland中的一个循环。
https://stackoverflow.com/questions/5069092
复制相似问题