2012-04-04 149 views
1

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

这一切似乎工作,直到处理过程中发生错误。错误处理程序没有显式的Kill或DeleteFile,错误只是被处理,并且处理继续下一条消息。一旦发生这种情况,CreateTextFile方法将失败,因为文件已存在(即使CreateTextFile调用传递为True覆盖),每个后续项目都会发生'Permission denied'错误。

我已经尝试了各种各样的东西,最着名的是把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不应该干扰文件),但错误依然存在。

感谢

+2

你有多确定在代码有机会关闭文件之前没有发生错误(例如'tsObj.Close'之前的错误)? – rskar 2012-04-04 13:43:14

+0

您在“<可能引发错误的某些处理>”中有遗漏的代码...代码打开了有问题的文件的任何机会,并且处理过程中出现错误会导致您在关闭之前跳出它? – tcarvin 2012-04-04 14:37:44

+0

你能否发布缺少的代码段,尽管你提到它有它自己的错误处理,它可能会保存密钥^ _^ – 2012-04-04 14:55:08

回答

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 
+0

为什么它会获得只读标志?如果这真的解决了问题,我希望我们仍然错过了一些东西。 – Deanna 2014-07-30 10:00:09

0

你或许应该在的ErrorHandler前添加退出函数或退出小组。

2

试试下面的问题可能是你错误的原因:

  1. 程序(或其他程序)依然采用了文件,当你要求它删除。您必须先使用该文件正确关闭连接。

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

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

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

+0

你的指针#1解决了我的问题。谢谢@FrozenFire – PravyNandas 2017-09-04 11:13:43

0

我知道这是旧的,但一个偶然的机会我在一些古老的VB6代码,我支持过类似的错误来了,原因可能帮助别人,因为我做了这个网页上登陆。结果问题是使用FreeFile打开的文件句柄的数量。如果FreeFile返回的数字达到255(这是最大值),那么如果您打开另一个文件(文件句柄号为255),则会开始获得'Permission Denied'错误,然后尝试将其删除。就我而言,这个错误只是说文件在打开后没有被关闭。