【发布时间】:2011-01-03 12:22:13
【问题描述】:
我有以下一段 VBSCript 代码来在纯文本文件中查找一个部分 (strSection) 和该部分中的一个项目 (strItem)。
Do While Not myINIFile.AtEndOfStream
sl_Sleep(100)
s = myINIFile.ReadLine <--- **This is the line that rises the exception**
If s = strSection Then
'Find the correct line
Do While Not myINIFile.AtEndOfStream
s = myINIFile.ReadLine
If InStr(s, strItem)>0 Then
Exit Do
End if
Loop
Exit Do
End if
Loop
看来,如果我不设置 Sleep(100)(毫秒)(或使用较低的值,如 20 或 50),我最终会收到一个异常,提示“该进程无法访问文件,因为另一个进程已锁定一部分文件”。
我认为 Do While 中的条件是在 AtEndOfStream 尚未完成时正在调用 ReadLine 方法。但是,对每条线路使用 100 毫秒会使该过程减慢到无法接受的速度。
这是真正发生的事情还是其他地方的问题? 我可以做些什么来防止这个进程被锁定或等待多一点(直到它被释放)只有如果它被锁定所以它不会引发异常?
编辑:这段代码循环通过一个看起来像这样的文件:
[Section1]
param1 = 100
param2 = 200
param3 = 300
[Section2]
param1 = 1000
param2 = 2000
param3 = 3000
[Section3]
param1 = 1
param2 = 2
param3 = 5
param4 = 10
param5 = 20
代码应该遍历文件,直到找到 [SectionX] 行 (strSection),然后继续读取行,直到找到“paramx”行 (strItem)。然后将这一行保存在 's' 中,稍后进行处理。
【问题讨论】:
-
这段代码有效吗?看一眼,看起来你正在循环一个文件流直到你得到一个匹配,然后你又循环了同一个流。令人困惑的是,它似乎没有做任何事情,一旦您找到与您正在寻找的内容匹配的行,它就会简单地退出循环。我认为,如果您发布了您尝试解析的数据样本,它可能会有所帮助。
-
代码工作,虽然它有这种瓶颈。有关详细信息,请参阅编辑后的说明。
-
我同意@unrealtrip,你有两个循环,但都从同一个流对象中读取,所以它不应该锁定流。您是否在调用此函数之间正确关闭了流?
-
您发布的代码无法使用。您正在按照错误所说的进行操作并尝试循环相同的流。看看我在下面发布的简单循环应该可以解决问题。
标签: file exception process vbscript locked