Vb6 DeleteFile和CreateTextFile上的FileSystemObject“权限被拒绝”

Vb6 DeleteFile和CreateTextFile上的FileSystemObject“权限被拒绝”,vb6,Vb6,我正在调查一个旧的VB6应用程序的问题,它刚刚开始在它运行的专用XP机器上运行。应用程序处理电子邮件消息,并为每个项目将文件写入本地目录,将文件路径传递给另一个函数进行处理,然后通过Kill命令删除文件 在处理过程中出现错误之前,这一切似乎都是有效的。错误处理程序中没有显式的Kill或DeleteFile,只处理错误,处理将继续下一条消息。一旦发生这种情况,CreateTextFile方法就会对后续的每个项目失败,并出现“权限被拒绝”错误,因为即使CreateTextFile调用通过True进行

我正在调查一个旧的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不应该干扰文件,但错误仍然存在


谢谢

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

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

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

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

您可能应该在errorhandler之前添加一个Exit函数或Exit子函数

您可能应该在errorhandler之前添加退出函数或退出子函数

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

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

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

您可能没有访问其他用户帐户下的系统文件或路径的权限

如果仍然无法工作,请检查文件是否已损坏。很可能是损坏的文件拒绝了程序的访问


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

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

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

您可能没有访问其他用户帐户下的系统文件或路径的权限

如果仍然无法工作,请检查文件是否已损坏。很可能是损坏的文件拒绝了程序的访问


我知道这很古老,但我偶然在我支持的一些古老的VB6代码中遇到了类似的错误,原因可能会帮助像我一样登上此页的人。问题在于使用FreeFile打开的文件句柄的数量。如果FreeFile返回的最大值为255,则如果打开另一个文件(文件句柄号也为255),然后尝试删除该文件,则会出现“权限被拒绝”错误。在我的例子中,错误仅仅是文件打开后没有关闭。

我知道这是旧的,但碰巧我在我支持的一些古老的VB6代码中遇到了类似的错误,原因可能会帮助像我一样登录此页面的人。问题在于使用FreeFile打开的文件句柄的数量。如果FreeFile返回的最大值为255,则如果打开另一个文件(文件句柄号也为255),然后尝试删除该文件,则会出现“权限被拒绝”错误。在我的例子中,错误只是文件在打开后没有关闭。

在代码有机会关闭文件之前,您是否确定没有发生错误,例如tsObj.close之前的错误?您已经在…处输入了代码,如果代码有可能打开所讨论的文件,你提到的处理过程中的错误会导致你在关闭前跳出?你能发布丢失的代码部分吗
t有自己的错误处理,它可能持有密钥^ ^您真的应该在检查文件是否存在时包装您的调用以终止该文件。也就是说,如果fsObj.FileExistsC:\Temp\MyFile.txt,那么……在代码有机会关闭文件之前,您有多确定没有发生错误,例如在tsObj.close之前发生错误?您在……有可能代码打开了有问题的文件时,您已经输入了代码,您提到的处理过程中的错误会导致您在关闭之前跳出?请您发布丢失的代码段,即使您提到它有自己的错误处理,它可能会保留密钥^ ^您确实应该在检查文件是否存在时结束调用以终止该文件。也就是说,如果fsObj.FileExistsC:\Temp\MyFile.txt,那么…为什么它会获得只读标志?如果这真的解决了它,我想我们仍然缺少一些东西。为什么它会获得只读标志?我想如果这真的解决了问题,我们还是会错过一些东西。