Lotus notes 运行时错误53“;“未找到文件”;来自LotusScript代理(已解决)

Lotus notes 运行时错误53“;“未找到文件”;来自LotusScript代理(已解决),lotus-notes,lotus-domino,lotusscript,hcl-notes,Lotus Notes,Lotus Domino,Lotusscript,Hcl Notes,由于未知原因,服务器端LotusScript代理在尝试读取现有邮件存档文件的物理文件大小时抛出错误53“未找到文件”。情况如下: LS代理正在循环服务器“\Data”目录正下方给定目录“\archive”中的所有文件。所讨论的服务器是运行在Windows 2016服务器上的Domino 10.0.1。 LS代码在目录中循环查找数据库文件,这些文件的名称遵循给定的模式,如“a_EmployeeID.nsf”。如果DB的文件名符合模式,则代码将使用文件名中的EmployeeID扫描服务器的names

由于未知原因,服务器端LotusScript代理在尝试读取现有邮件存档文件的物理文件大小时抛出错误53“未找到文件”。情况如下:

LS代理正在循环服务器“\Data”目录正下方给定目录“\archive”中的所有文件。所讨论的服务器是运行在Windows 2016服务器上的Domino 10.0.1。 LS代码在目录中循环查找数据库文件,这些文件的名称遵循给定的模式,如“a_EmployeeID.nsf”。如果DB的文件名符合模式,则代码将使用文件名中的EmployeeID扫描服务器的names.nsf以查找归档所有者。如果找不到该ID的个人文档,代码将尝试使用
FileLen(filePath&FileName)
读取数据库的物理文件大小。然后,结果数据(文件路径+文件大小)+EmployeeID被写入磁盘上的报告文件。不遵循该模式的文件也至少会写回报告。该代理背后的想法是查找“孤立”或错位的数据库

对于扫描的约80%的文件,此方法效果良好,具有精确文件大小的记录会写入报告中。但对于另一个~20%的运行时
错误53“未找到文件”
将出现。在这种情况下,记录只包含文件大小的文件路径/名称+EmployeeID(如果可用)+“-1”。因为文件显然确实存在,所以我假设这是一个访问或安全问题

代理使用管理员ID签名,管理员ID对服务器和相关归档文件具有最大访问权限(策略ID在dbs的ACL中具有Manager访问权限)。 代理的安全设置设置为3级(具有完全管理员权限的不受限制的访问),因为我第一次使用在服务器上具有完全管理员访问权限的ID对代理进行了签名(与现在使用的ID的结果相同)

比较数据库的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.1GB。所以我必须承认我犯了一个愚蠢的编程错误:给一个长变量分配一个如此大的值当然是行不通的。愚蠢的业余错误。。。 (但是为什么代码没有像通常那样抛出正确的错误,告诉值超出了限制?) 总之,我把变量改成了双精度。 但是:结果仍然相同,尽管>>错误53。 然后再次查看Designer帮助,我发现了以下小提示:

FileLen返回一个长值

换句话说:FileLen本身无法处理这种大小的文件,而这个错误显然是在解释器发现我的错误编码之前抛出的。 换句话说:没有办法用那种方式解决我的问题。回到@TorstenLink的评论:我现在就用他的方法

非常奇怪的错误信息,我还是会说


感谢所有帮助我思考的人;)

因为您只从disk:DIR和FileLen读取,所以您不应该遭受文件上的Domino锁定(但不要尝试写入!)

我建议您更改代码,以确定代码的位置和文件:

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

Domino将数据库锁定在其访问范围内,以便在Domino之外进行访问。我从未试图从文件系统中获取这样的信息。。。为什么不使用notesdddirectory呢?是的,使用notesdddirectory是我最初的计划。但后来我意识到这个方法有两个星期的点:-#1循环这个对象我对循环的文件夹没有任何控制权。所讨论的服务器包含数万个数据库,但我只对\archive文件夹下的数据库感兴趣,它始终是整个服务器。-#2使用此对象,我只能访问数据库对象。我必须检查它是否存储在正确的文件夹中,然后检查它的文件名是否遵循给定的模式。如果两者都是这样的话,我必须打开数据库来查找它的大小,这与文件名中的特殊字符有什么关系吗?注意,bddirectory是一个非常快速的对象。除非打开数据库,否则在数千个数据库中循环只需几秒钟(NotesDatabase-通过NotesDB目录获取的对象未打开,需要为感兴趣的数据库调用db.open(“,”)。并且可以从关闭的对象读取文件路径:
如果左(db.filepath,8)=“archive\”,则
。这将是非常快的,因为你只需要真正打开文件在正确的路径…@Duston-不应该是一个问题。模式基本上是“a_EmpID.nsf”,其中EmpID是以“E”开头的6个字符,后跟第二个简单的ASCII字符(通常是a到E),后跟4位数字。但仔细观察仍然是个好主意——也许有一些“看不见的”特殊字符。我会检查的,谢谢你的输入,但我已经知道代码“失败”在哪个文件上:在错误53,我继续,然后根据你在DIR中的过滤器将文件名写入我的报告,你的所有文件都是*.nsf,所以它似乎不相关,但请看一看。很有趣,谢谢你的链接。我不觉得这有什么关系,但我也觉得我的代码应该按照它的方式工作:D仍然可以从VB/VBA脚本中尝试同样的方法