3

別のプロセスで開かれているファイルを呼び出しFile.Delete(file_path)ている間、試行はアクセスできないエラーで失敗しますが、(試行が行われた場所から) アプリを終了すると、ファイルは自動的に削除されます。試行後File.Delete、他の操作でパスにアクセスできなくなります。

削除に失敗してアプリからパスにアクセスできるようにするか、アプリの終了時ではなく、ファイルを完全に削除する必要があります。

さて、私のコードはこれです:

 private bool DeleteFilesAsync(string FileToDelete)
 {
    try
    {
            //Set file's attribute to normal if it is ReadOnly file
            File.SetAttributes(FileToDelete, FileAttributes.Normal);

            File.Delete(FileToDelete);
           //Some bussiness logic to update file's status in database

        return true;
    }
    catch (Exception ex)
    {
        //log the error
         return false;
    }
}

ここで何か問題がありますか?

4

1 に答える 1

4

Windowsには、最後に閉じるときに削除する機能があります。すべての削除はそのように処理されます。これが実際にほとんど発生しない唯一の理由は、ほとんどのアプリがでファイルを開かないFILE_SHARE_DELETEため、使用済みファイルを削除できないためです。ただし、カーネルレベルでは、すべての削除はクローズ時に削除されます。

クラスNtSetInformationFileを設定するために呼び出すことにより、削除フラグをクリアする方法があるかもしれません。FileDispositionInfoこれは、削除フラグをクリアできることを前提としています。そうかもしれません。

とにかく、より適切なアプローチは、ファイルを削除する前にファイルを開いて、排他的アクセスが利用可能であることを確認することです。

using(new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { }

この行が例外なく通過した後、ファイルを開いた時点でファイルが使用されていなかったことがわかります。もちろん、この行の直後に他の誰かによって開かれる可能性がありますが、おそらくこのソリューションで十分です。

于 2012-11-03T13:39:35.110 に答える