我正在调查一个旧的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不应该干扰文件)但仍然存在错误。
由于
答案 0 :(得分:2)
尝试以下问题可能是导致错误的原因:
当您请求删除时,程序(或其他程序)仍在使用该文件。您必须先使用该文件正确关闭连接。
在创建/删除文件之前,首先检查分配的路径/文件是否存在。如果您确定该文件确实存在,请尝试确定该程序是否有权访问该路径。您可以使用fso.fileexists()
或fso.folderexists()
执行此操作。
您可能无权访问其他用户帐户下的系统文件或路径。
如果仍然无法正常工作,请检查文件是否已损坏。最有可能损坏的文件会拒绝您的程序访问。
答案 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)然后尝试删除它,则会开始获得“权限被拒绝”错误。在我的情况下,错误只是文件在打开后没有关闭。