DeleteFile和CreateTextFile上的FileSystemObject“Permission Denied”

时间:2012-04-04 12:42:55

标签: vb6

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

这一切似乎都有效,直到处理过程中出现错误。错误处理程序中没有显式的Kill或DeleteFile,只是处理错误并继续处理下一条消息。一旦发生这种情况,CreateTextFile方法就会因为文件已经存在而导致“Permission denied”错误的每个后续项失败(即使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 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我知道这是旧的,但我偶然发现了一些类似的错误,我支持的一些古老的VB6代码,原因可能会帮助像我一样登陆这个页面的人。问题结果是使用FreeFile打开的文件句柄数。如果FreeFile返回的数字达到255(这是它的最大值),那么如果然后打开另一个文件(文件句柄号为255)然后尝试删除它,则会开始获得“权限被拒绝”错误。在我的情况下,错误只是文件在打开后没有关闭。