|   | 
          
 
            
|  
              
 .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) | 
 これを実行すると、次のような結果になる。
 続けてもう一度実行すると次のような結果になる。
 本稿のような実装は、例えば(ファイルが読み取り専用に設定されているかどうかは無視して)必ずファイルの書き込みを行う必要があるケースなどで有効である。読み取り専用の属性を確認・解除したうえでファイルの書き込みを実行するようにすれば、読み取り専用が原因でファイル書き込みのエラーが発生することはなくなる。
          
 
            
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル 
使用ライブラリ:Fileクラス(System.IO名前空間) 
使用ライブラリ:FileAttributes列挙体(System.IO名前空間)
 | 
        
 
        
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間