.NET TIPS

ファイルやディレクトリの読み取り専用属性を確認/設定/解除するには?

デジタルアドバンテージ 一色 政彦
2005/10/07

 ファイルやディレクトリに読み取り専用の属性が設定されている場合、ファイルの削除やそのファイルへの書き込みなどは失敗してしまう。本稿では、そのような場合に対処する方法として、いったんファイルやディレクトリの属性を確認し、読み取り専用属性が設定されている場合にはそれを解除したり、逆に設定したりする方法を紹介する。

1. ファイルやディレクトリの属性の取得

 まずはファイルやディレクトリの属性を取得する必要がある。これには、Fileクラス(System.IO名前空間)の静的メソッドであるGetAttributesメソッドを呼び出せばよい。このメソッドはFileクラスのメンバではあるが、ファイルだけでなくディレクトリに対しても使用できる。

 GetAttributesメソッドを使うには、その第1パラメータにファイルやディレクトリのパスを指定して呼び出せばよい。メソッドの戻り値は、FileAttributes列挙体(System.IO名前空間)のオブジェクトである。このFileAttributesオブジェクトが、ファイルやディレクトリに設定されている属性(群)を表す。

 取得したFileAttributesオブジェクトの値は、そのファイルやディレクトリがどのような属性を持っているかを特定のビットにより示す。属性の一覧はFileAttributes列挙体の値で定義されており、属性値を確認したり設定したりするには、取得したFileAttributesオブジェクトとFileAttributes列挙体の値をビット演算することにより行える(ビット演算については、C#は「C#プログラミングリファレンス」を、VB.NETは「VB.NETプログラミングリファレンス 」を参照してほしい)。

 なおFileAttributes列挙体の値には、読み取り専用属性(FileAttributes.ReadOnly)だけでなく、隠しファイル属性(FileAttributes.Hidden)などさまざまな属性が用意されている。これらの属性についての詳細は、MSDNの「FileAttributes列挙体」の項を参照されたい。

2. 読み取り専用属性の確認

 ファイルやディレクトリの属性(群)を取得できたら、次はその属性(群)に「読み取り専用」(FileAttributes.ReadOnly)の属性が入っているかどうかを確認しよう。

 これを行うには、先ほど述べたようにビット演算を行う必要がある。次のコードは、読み取り専用を確認するためのサンプル・コードだ。

// ファイルやディレクトリの属性(群)を取得
FileAttributes fas = File.GetAttributes(@"C:\test\シャボン.bmp");
// 属性(群)の中に読み取り専用があるかどうかを確認(ビット演算)
bool bReadOnly =
  ((fas & FileAttributes.ReadOnly) == FileAttributes.ReadOnly);
' ファイルやディレクトリの属性(群)を取得
Dim fas As FileAttributes =  File.GetAttributes("C:\test\シャボン.bmp")
' 属性(群)の中に読み取り専用があるかどうかを確認(ビット演算)
Dim bReadOnly As Boolean = _
  ((fas And FileAttributes.ReadOnly) = FileAttributes.ReadOnly)
読み取り専用を確認するためのサンプル・コード(上:C#、下:VB.NET)

3. 読み取り専用属性の設定と解除

 最後に読み取り専用の属性を設定したり、解除したりする方法を説明する。

 これには、Fileクラスの静的メソッドであるSetAttributesメソッドを呼び出せばよい。SetAttributesメソッドの第1パラメータにはファイルやディレクトリのパスを指定し、第2パラメータには属性値(=FileAttributesクラスのオブジェクト)を指定する。

string path = @"C:\test\シャボン.bmp";
FileAttributes fas = File.GetAttributes(path);
// ファイル属性に読み取り専用を追加
fas = fas | FileAttributes.ReadOnly;
// ファイル属性を設定
File.SetAttributes(path, fas);
Dim path As String = "C:\test\シャボン.bmp"
Dim fas As FileAttributes =  File.GetAttributes(path)
' ファイル属性に読み取り専用を追加
fas = fas Or FileAttributes.ReadOnly
' ファイル属性を設定
File.SetAttributes(path, fas)
読み取り専用を設定するためのサンプル・コード(上:C#、下:VB.NET)
 
string path = @"C:\test\シャボン.bmp";
FileAttributes fas = File.GetAttributes(path);
fas = fas & ~FileAttributes.ReadOnly;
File.SetAttributes(path, fas);
Dim path As String = "C:\test\シャボン.bmp"
Dim fas As FileAttributes =  File.GetAttributes(path)
' ファイル属性から読み取り専用を削除
fas = fas And Not FileAttributes.ReadOnly
' ファイル属性を設定
File.SetAttributes(path, fas)
読み取り専用を解除するためのサンプル・コード(上:C#、下:VB.NET)

4. 読み取り専用属性の確認と設定を行うサンプル・プログラム

 以上の内容を実際に実装したのが、以下のサンプル・プログラムだ。このサンプル・プログラムでは、ファイル(やディレクトリ)の属性群を確認して、その中に読み取り専用属性が設定されていればそれを解除し、逆に設定されていなければ設定する。このプログラムを実行するたびに読み取り専用属性の設定がトグルする(=切り替わる)仕組みになっている。

using System;
using System.IO;
using System.Reflection;

namespace ConsoleApplication1
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      string path = @"C:\test\シャボン.bmp"; // ファイル
      //string path = @"C:\test\"; // ディレクトリ

      // ファイル属性を取得
      FileAttributes fas = File.GetAttributes(path);

      // 読み取り専用かどうか確認
      if ((fas & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
      {
        Console.WriteLine("読み取り専用です。");

        // ファイル属性から読み取り専用を削除
        fas = fas & ~FileAttributes.ReadOnly;
      }
      else
      {
        Console.WriteLine("読み取り専用ではありません。");

        // ファイル属性に読み取り専用を追加
        fas = fas | FileAttributes.ReadOnly;
      }

      // ファイル属性を設定
      File.SetAttributes(path, fas);


      Console.Read();
    }
  }
}
Imports System.IO
Imports System.Reflection


Module Module1

  Sub Main()
    Dim path As String = "C:\test\シャボン.bmp" ' ファイル
   
'Dim path As String = "C:\test\" ' ディレクトリ

    ' ファイル属性を取得
    Dim fas As FileAttributes = File.GetAttributes(path)

    ' 読み取り専用かどうか確認
    If (fas And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
      Console.WriteLine("読み取り専用です。")

      ' ファイル属性から読み取り専用を削除
      fas = fas And Not FileAttributes.ReadOnly
    Else
      Console.WriteLine("読み取り専用ではありません。")

      ' ファイル属性に読み取り専用を追加
      fas = fas Or FileAttributes.ReadOnly
    End If

    ' ファイル属性を設定
    File.SetAttributes(path, fas)

    Console.Read()

  End Sub

End Module
メソッドやプロパティの有無を確認して呼び出すサンプル・プログラム(上:C#、下:VB.NET)

 これを実行すると、次のような結果になる。

読み取り専用ではありません。
サンプル・プログラムの実行結果(1回目)

 続けてもう一度実行すると次のような結果になる。

読み取り専用です。
サンプル・プログラムの実行結果(2回目)

 本稿のような実装は、例えば(ファイルが読み取り専用に設定されているかどうかは無視して)必ずファイルの書き込みを行う必要があるケースなどで有効である。読み取り専用の属性を確認・解除したうえでファイルの書き込みを実行するようにすれば、読み取り専用が原因でファイル書き込みのエラーが発生することはなくなる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:Fileクラス(System.IO名前空間)
使用ライブラリ:FileAttributes列挙体(System.IO名前空間)
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]ページから生成されたソース・コードを見るには?
ファイルやディレクトリの一覧を取得するには?
ファイルやディレクトリをすべてのサブディレクトリから検索するには?
ファイルやディレクトリのタイムスタンプを取得/設定するには?
[ASP.NET]ユーザー・コントロールで属性を設定するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間