1

我正在调查一个旧的 VB6 应用程序的问题,该应用程序刚刚开始在它运行的专用 XP 机器上发生。应用程序处理电子邮件消息,并为每个项目将文件写入本地目录,将文件路径传递给另一个函数进行处理,然后通过 Kill 命令删除文件。

这一切似乎都有效,直到处理过程中发生错误。错误处理程序中没有明确的 Kill 或 DeleteFile,错误只是被处理并继续处理下一条消息。一旦发生这种情况,CreateTextFile 方法对于每个后续项目都会失败,并出现“权限被拒绝”错误,因为文件已经存在(即使 CreateTextFile 调用传递 True 以进行覆盖)。

我尝试了各种方法,最值得注意的是在错误处理程序中放置 Kill、FSO.DeleteFile 或对 DeleteFile API 的调用,但这些都不起作用(前两个因权限被拒绝而失败,API 不会出错但不会删除文件)。

我已经在机器上安装了 Unlocker,唯一锁定文件的进程是有问题的应用程序。一旦问题发生,Filemon 就会在“IRP_MJ_CREATE”之后报告文件上的“共享冲突”,所以我想这可能指向问题,但我看不出问题到底是什么。

简化代码如下:

Do While objMessages.Count > 0
    Set fsObj = CreateObject("Scripting.FileSystemObject")
    Set tsObj = fsObj.CreateTextFile("C:\Temp\MyFile.txt", True)
    ...
    tsObj.Close
    Set tsObj = Nothing
    Set fsObj = Nothing
    ...
    <some processing which may raise an error>
    ...
    Kill ("C:\Temp\MyFile.txt")    ' Works if no error raised & processing continues ok
    ...
    ...
Loop

ErrorHandler:
    Kill ("C:\Temp\MyFile.txt")                             ' Permission Denied
    Set fsObj = CreateObject("Scripting.FileSystemObject")
    fsObj.DeleteFile("C:\Temp\MyFile.txt", True)            ' Permission Denied 
    Dim lRet As Long
    lRet = DeleteFile(gstrBodyTextFile)                     ' Nothing done
    ' After error, processing returns to calling procedure 
    ' which is in a loop and calls back into here and starts
    ' to fail on CreateTextFile

这让我很难过,我不得不承认,如果有人能建议它可能是什么,我将不胜感激。我应该补充一点,McAfee 已安装在机器上,但我已将其删除以排除其干扰(即使 Unlocker 不应该干扰文件),但错误仍然存​​在。

谢谢

4

4 回答 4

3

尝试以下问题可能是您的错误的原因:

  1. 当您请求删除该文件时,该程序(或其他程序)仍在使用该文件。您必须先正确关闭与文件的连接。

  2. 在创建/删除文件之前首先检查分配的路径/文件是否存在。如果您确定该文件确实存在,请尝试确定该程序是否有权访问该路径。您可以使用fso.fileexists()fso.folderexists()来执行此操作。

  3. 您可能无权访问其他用户帐户下的系统文件或路径。

  4. 如果仍然无法正常工作,请检查文件是否已损坏。最有可能损坏的文件拒绝从您的程序访问。

于 2014-05-15T09:13:32.157 回答
2

我认为这不能解决所有问题,但我认为值得尝试:

Dim fl As File
If fso.FileExists(FileName) Then
    Set fl = fso.GetFile(FileName)
    If (fl.Attributes And ReadOnly) Then
      fl.Attributes = fl.Attributes - ReadOnly
    End If
End If
于 2012-04-04T13:10:42.660 回答
0

您可能应该在错误处理程序之前添加一个 Exit Function 或 Exit Sub。

于 2014-02-05T09:21:59.060 回答
0

我知道这是旧的,但偶然我在我支持的一些古老的 VB6 代码中遇到了类似的错误,原因可能会帮助像我一样登陆此页面的人。问题出在使用 FreeFile 打开的文件句柄的数量上。如果 FreeFile 返回的数字达到 255(这是最大值),如果您打开另一个文件(也将具有 255 的文件句柄号)然后尝试删除它,则会开始收到“权限被拒绝”错误。就我而言,错误只是文件在打开后没有被关闭。

于 2014-07-30T03:46:36.307 回答