[ VB.NET / C# 謎仕様 ] 読み取り専用ファイルが削除できない ( UnauthorizedAccessException )

Pocket

C# や VB.NET において、ファイルを削除することは良くあることだと思いますが、どうにも腑に落ちない仕様があります。読み取り専用ファイルを削除しようとすると UnauthorizedAccessException 例外が発生することです。個人的な感覚ですので、論破していただける方お待ちしております。

スポンサーリンク

File.Delete メソッドを MSDN で確認すると、以下のような記載があります。UnauthorizedAccessException 例外が発生する条件部分を抜粋したものです。

UnauthorizedAccessException 呼び出し元に、必要なアクセス許可がありません。

または

ファイルが使用されている実行可能ファイルです。

または

path がディレクトリです。

または

path によって、読み取り専用のファイルが指定されました。

この仕様にために File.Delete メソッドを使用してファイルを削除する場合は、読み取り専用属性をはずしてから削除するというような処理が必要になります。また、ファイルの削除は FileInfo クラスでもできます。MSDN によると FileInfo.Delete メソッドは読み取り専用のファイルが指定された場合に、UnauthorizedAccessException 例外が発生するとの記載はありません。

動作確認は行っていませんので実際は違うかもしれませんが、MSDN の記載を正とすると FileInfo.Delete メソッドで読み取り専用属性をはずす処理は無駄ということになります。(繰り返しますが、実際はわかりません)

無駄かもしれない読み取り専用属性の解除

C#

string fpath = @"deletefilepath.txt";
FileInfo fi = new FileInfo(fpath);

// 読み取り属性の確認のためにファイルの存在確認
if (fi.Exists) {
    // 読取専用属性をはずすのは無駄かも?無駄じゃないかも?
    if ((fi.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)) {
        fi.Attributes = FileAttributes.Normal;
    }
    // ファイル削除
    fi.Delete();
}

ここまで長々と動作確認も行っていないサンプルなど掲載しているために論点がぶれそうになっている感じもしますが、要点は次の通りです。

なぜ、読み取り専用属性を解除する権限のあるアプリがファイルを削除できないか?

ということです。

読み取り専用属性を削除した後、ファイルを削除するということが腑に落ちないのです。読み取り専用ファイルとファイルの削除権限は別物ではないかと個人的には思っているのです。

仕様だから仕方ないのはわかりますが、なぜそのような仕様なのかを未だ納得できずにいます。誰か暇で優しい人がいましたら教えていただけるとうれしいです。

私は M ではありませんが、自分の考え(思想)が間違いだと、自分で納得できた時は非常に気分が良いのです。一皮ズル剥けた気になります。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *