首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextStream.AtEndOfStream有时是不真实的

TextStream.AtEndOfStream有时是不真实的
EN

Stack Overflow用户
提问于 2011-02-21 17:22:17
回答 1查看 7.8K关注 0票数 0

我有一个vb脚本,用于处理服务器上的文本文件,但是,有时没有任何明显的原因,脚本会陷入循环。

文件由客户端通过ftp (大约2-10 kb)上传,这是一个.Net服务,它监视ftp文件夹启动一个可执行文件(用VB6编写),可执行文件将文件从ftp文件夹移动到一个处理它的文件夹。此时,exe将启动vb脚本。98%的脚本运行时没有问题。

当无限循环发生时,我将终止exe进程。奇怪的是,当我手动重新启动该进程(通过将它复制回正在监视的文件夹)时,它会完全相同,不会出现问题。

简而言之,脚本将文件打开为文本流,然后循环遍历TextStream对象,直到其AtEndOfStream属性为真为止。在循环中,它创建一个新文件,添加一些附加信息,现在每当infinate循环情况发生时,临时文件不包含任何源文件数据,只包含脚本添加的额外数据,例如,下面的代码在98%的时间内工作:

代码语言:javascript
复制
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部分,这实际上阻止了当前行号的递增。例如:

代码语言:javascript
复制
sOriginalRow = "" 'ts.ReadLine

有人能提出建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-22 07:53:15

就像你说的,我唯一能提供的是建议,而不是真正的答案:

您的流可能与ObjectDisposedException (在VBScript中不可捕获)发生碰撞,因此EndOfStream条件得到<>为真,但不为假。

为了进行实验,你可以尝试将Do While ts.AtEndOfStream <> True改为Do While Not ts.AtEndOfStreamDo Until ts.AtEndOfStream,但我的生物逻辑电路告诉我,这可能行不通。

还有一个问题描述,其中stdIn和stdErr相互冲突,在特定情况下导致挂起。

请你也回答Tmdean的评论。在错误恢复时,下一步可能会造成真正的混乱:如果ts.AtEndOfStream返回空或垃圾(例如,由于ts被销毁),它将不会变成True,并将导致Foreverland中的一个循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5069092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档