【C#】ファイルの「読み取り専用」属性を確認・変更する (FileInfo.IsReadOnly)

重要な設定ファイルや、誤って上書き・削除されたくないデータファイルに対して、プログラムから「読み取り専用(ReadOnly)」属性を付与したり、逆に編集するために属性を解除したりする方法について解説します。

C# では FileInfo クラスの IsReadOnly プロパティを使用することで、この属性を true / false の切り替えだけで簡単に操作できます。

目次

実装サンプル:重要データの保護ロック

以下のコードでは、機密データファイル(Confidential.dat)の状態をチェックし、読み取り専用であれば編集できるように解除し、そうでなければ保護のために読み取り専用に設定する(トグル動作)処理を行っています。

サンプルコード

using System;
using System.IO;

public class Program
{
    public static void Main()
    {
        // 操作対象のファイルパス
        string filePath = "Confidential.dat";

        // 1. テスト用にファイルが存在しなければ作成する
        if (!File.Exists(filePath))
        {
            File.WriteAllText(filePath, "TOP SECRET DATA");
        }

        // 2. FileInfoインスタンスの生成
        var fileInfo = new FileInfo(filePath);

        Console.WriteLine($"ファイル: {fileInfo.Name}");
        
        // 3. 現在の属性を確認して分岐
        if (fileInfo.IsReadOnly)
        {
            Console.WriteLine("状態: [ロック中] 読み取り専用です。");
            
            // 属性を変更: 読み取り専用を解除(書き込み可能にする)
            fileInfo.IsReadOnly = false;
            
            Console.WriteLine("処理: ロックを解除しました。これで編集・削除が可能です。");
        }
        else
        {
            Console.WriteLine("状態: [編集可] 通常ファイルです。");
            
            // 属性を変更: 読み取り専用に設定(上書き防止)
            fileInfo.IsReadOnly = true;
            
            Console.WriteLine("処理: ファイルをロックしました。");
        }

        // 4. 変更後の確認
        fileInfo.Refresh(); // キャッシュを更新
        Console.WriteLine($"現在の属性(IsReadOnly): {fileInfo.IsReadOnly}");
    }
}

実行結果(1回目:通常状態からスタート)

ファイル: Confidential.dat
状態: [編集可] 通常ファイルです。
処理: ファイルをロックしました。
現在の属性(IsReadOnly): True

実行結果(2回目:ロック状態からスタート)

ファイル: Confidential.dat
状態: [ロック中] 読み取り専用です。
処理: ロックを解除しました。これで編集・削除が可能です。
現在の属性(IsReadOnly): False

解説と技術的なポイント

1. IsReadOnly プロパティ

FileInfo.IsReadOnly は、ファイルの属性(Attributes)の中に FileAttributes.ReadOnly フラグが含まれているかどうかを自動的に判別してくれる便利なプロパティです。

  • 取得 (get): 読み取り専用なら true を返します。
  • 設定 (set): true を代入すると OS 上で読み取り専用属性が付与され、false を代入すると解除されます。

2. 読み取り専用ファイルの削除について

読み取り専用属性が付いているファイルに対して、File.Delete()StreamWriter での上書きを行おうとすると、UnauthorizedAccessException(アクセス拒否例外) が発生します。 プログラムでファイルを削除・更新する際は、まずこの属性をチェックし、必要なら IsReadOnly = false で解除してから操作を行うのが安全な設計です。

3. その他の属性(隠しファイルなど)

読み取り専用以外の属性(隠しファイル Hidden や システムファイル System など)を操作したい場合は、File.GetAttributes および File.SetAttributes メソッドを使用し、ビット演算を行う必要がありますが、読み取り専用に関しては FileInfo を使うのが最も直感的で簡単です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次