微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自 LotusScript 代理的运行时错误 53“找不到文件”已解决

如何解决来自 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 举报,一经查实,本站将立刻删除。