如何解决来自 LotusScript 代理的运行时错误 53“找不到文件”已解决
由于未知原因,服务器端 LotusScript 代理在尝试读取现有邮件存档文件的物理文件大小时抛出错误 53“找不到文件”。情况如下:
LS 代理正在循环服务器“\Data”目录正下方的给定目录“\archive”中的所有文件。有问题的服务器是在 Windows 2016 服务器上运行的 Domino 10.0.1。
LS 代码循环目录查找名称遵循给定模式(如“a_EmployeeID.nsf”)的数据库文件。如果数据库的文件名符合模式,则代码使用文件名中的 EmployeeID 扫描服务器的 names.nsf 以查找存档所有者。如果没有找到该 ID 的个人文档,代码会尝试使用 FileLen(filePath & FileName)
读取数据库的物理文件大小。然后将结果数据(文件路径 + 文件大小)+ EmployeeID 写入磁盘上的报告文件。不遵循该模式的文件也至少会写回报告。该代理背后的想法是找到“孤立”或错位的数据库。
对于大约 80% 的扫描文件,这工作正常,具有确切文件大小的记录将写入报告。但是对于其他约 20% 的运行时 error 53 "File not found"
拉起。在这些情况下,记录只包含文件路径/名称 + EmployeeID(如果可用)+ 文件大小的“-1”。因为该文件显然确实存在,所以我认为这是一个访问或安全问题。
代理使用管理员 ID 签名,该 ID 对服务器和相关存档文件具有最大访问权限(策略 ID 在 dbs 的 ACL 中具有管理员访问权限)。 代理的安全设置设为 3 级(具有完全管理员权限的无限制访问),因为我首先使用在服务器上具有完全管理员访问权限的 ID 为代理签名(结果与现在使用的 ID 相同)。
比较数据库的 ACL,我找不到“有效”和无效的 ACL 之间的任何区别。不过,我看到的是,抛出此错误的显然总是相同的数据库,因此这不是一个随机问题。
为了完整起见,这里是代理代码的关键部分:
sFileName = Dir$(sPath & "*.nsf")
Do Until sFileName = ""
iCount = iCount + 1
sEmpid = "" 'reset
lSizeArc = 0 'reset
dblSizeArc = 0 'reset
sSizeArcFmt = "" 'reset
If(sFileName Like sPattern) Then
sEmpid = Left(Right(sFileName,Len(sFileName) - 2),6)
Set vec = vwEgid.Getallentriesbykey(sEmpid,True)
If(vec.count = 0) Then
On Error 53 Resume Next 'Error 53 ("File not found")
lSizeArc = FileLen(sPath & sFilename)
If(Err = 53) Then
lSizeArc = -1
sSizeArcFmt = "-1 (no size available)"
Err = 0
Else
dblSizeArc = Round((lSizeArc / 1024 / 1024),3)
sSizeArcFmt = Format$(dblSizeArc,"0.000") & " MB"
End If
Print #iFileNum,_
"ORPHANED_ARCHIVE;" & sEmpid & ";" & sFileName & ";" & sSizeArcFmt
End If
Else
On Error 53 Resume Next 'Error 53 ("File not found")
lSizeArc = FileLen(sPath & sFilename)
If(Err = 53) Then
lSizeArc = -1
sSizeArcFmt = "-1 (no size available)"
Err = 0
Else
dblSizeArc = Round((lSizeArc / 1024 / 1024),3)
sSizeArcFmt = Format$(dblSizeArc,"0.000") & " MB"
End If
Print #iFileNum,_
"BAD_FILE_PATTERN;NO_EGID;" & sFilename & ";" & sSizeArcFmt
End If
sFileName = Dir$() 'next file
Loop
在我开始研究使用 Windows shell 或 .dll 命令等不同的方向之前,我真的很想了解为什么在某些情况下代码坚持认为无法“找到”某些查看的文件。
>有什么想法吗?
更新 2021-05-19
所以最后我找到了解决这个奇怪问题的方法(我承认这不是对我编程技能的赞美): 再次查看抛出错误 53 的文件,我意识到它们都相当大,准确地说是 > 2.1 GB。所以我不得不承认我犯了一个愚蠢的编程错误:当然,给 LONG 变量分配一个这么大的值是行不通的。愚蠢的业余错误... (但是为什么代码不会像通常那样抛出正确的错误,告诉值超出限制?) 无论如何,所以我将变量更改为 DOUBLE。 但是:结果仍然相同,尽管 >> 错误 53。 然后再次查看设计师帮助,我发现了这个小笔记:
FileLen 返回一个 Long 值
换句话说:FileLen 本身无法处理这么大的文件,而且这个错误显然是在解释器发现我的错误编码之前抛出的。 换句话说:没有办法以这种方式解决我的问题。回到@TorstenLink 的评论:我现在就用他的方法
非常奇怪的错误信息,我还是要说...
感谢所有帮助我思考的人;)
解决方法
由于您只从磁盘读取:DIR 和 FileLen,您不应该遭受文件上的 Domino LOCK(但不要尝试写入!)
我建议您更改您的代码,以确定它的位置和文件:
f(vec.count = 0) Then
placeInCode = 1 'declare this before as int
On Error 53 Resume goto handelError'Error 53 ("File not found")
在第二部分,影响 placeInCode = 2
然后声明一个
handelError:
print "we got error 53 on " & sPath & sFilename & " for the " & placeInCode & " part"
resume next
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。