重要な設定ファイルや、誤って上書き・削除されたくないデータファイルに対して、プログラムから「読み取り専用(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 を使うのが最も直感的で簡単です。
