2012-04-04 147 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'錯誤,然後嘗試將其刪除。就我而言,這個錯誤只是說文件在打開後沒有被關閉。