1

実行している専用のXPマシンで発生し始めたばかりの古いVB6アプリの問題を調査しています。アプリケーションは電子メールメッセージを処理し、アイテムごとにファイルをローカルディレクトリに書き込み、ファイルパスを別の関数に渡して処理してから、Killコマンドを使用してファイルを削除します。

処理中にエラーが発生するまで、すべてが機能しているようです。エラーハンドラには明示的なKillまたはDeleteFileが含まれていません。エラーは処理され、処理は次のメッセージに進みます。それが発生するとすぐに、CreateTextFileメソッドは、ファイルがすでに存在するため、「Permissiondenied」エラーで後続のすべてのアイテムに対して失敗します(CreateTextFile呼び出しは上書きのためにTrueを渡しますが)。

私はさまざまなことを試しましたが、特にKill、FSO.DeleteFile、またはDeleteFile APIの呼び出しをエラーハンドラーに入れましたが、これらはどれも機能しません(最初の2つはアクセスが拒否されて失敗し、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

4 に答える 4

3

次の問題を試してください。エラーの原因である可能性があります。

  1. プログラム(または他のプログラム)は、削除を要求したときにファイルをまだ使用しています。最初にファイルとの接続を適切に閉じる必要があります。

  2. ファイルを作成/削除する前に、割り当てられたパス/ファイルが存在するかどうかを最初に確認してください。ファイルが存在することが確実な場合は、プログラムがパスにアクセスする権利を持っているかどうかを確認してください。fso.fileexists() またはを使用fso.folderexists()してこれを行うことができます。

  3. 他のユーザーアカウントでシステムファイルまたはパスにアクセスする権限がない可能性があります。

  4. それでも機能しない場合は、ファイルが破損していないか確認してください。破損している可能性が高いファイルは、プログラムからのアクセスを拒否します。

于 2014-05-15T09:13:32.157 に答える
2

これですべてが解決するとは思いませんが、試してみる価値はあると思います。

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
于 2012-04-04T13:10:42.660 に答える
0

エラーハンドラの前に、ExitFunctionまたはExitSubを追加する必要があります。

于 2014-02-05T09:21:59.060 に答える
0

私はこれが古いことを知っていますが、偶然にも私がサポートしているいくつかの古いVB6コードで同様のエラーに遭遇しました、そして原因は私がしたようにこのページに着陸する誰かを助けるかもしれません。問題は、FreeFileを使用して開かれたファイルハンドルの数にあることが判明しました。FreeFileによって返される数が255(最大値)に達した場合、別のファイル(ファイルハンドル番号は255)を開いてから削除しようとすると、「アクセスが拒否されました」エラーが発生し始めます。私の場合、バグは単にファイルを開いた後に閉じられなかったということでした。

于 2014-07-30T03:46:36.307 に答える