「ファイルの属性」は、このファイルが「どういう」ファイルなのか、を表現するものです。
知られているだけでも種類がいろいろあります。
- 通常のファイルか
- 削除可能なファイルか
- 読み取り専用か
- 隠しファイル(ファイルは存在するが、通常は見えないようにしているファイル)か
- システムファイルか
- ディレクトリなのか(ディレクトリもファイルの一種という考え方です)
- 圧縮されているファイル
- データが暗号化されているか
これらの情報はSystem.IO.FileAttributesという列挙子(enum)で表現されます。
属性の取得方法(System.IO.FileAttributes)
System.IO.FileAttributesで属性を取得する方法は、2通りあります。
- System.IO.File.GetAttributes(string path) pathにファイルのパスを指定すると、戻り値で属性を取得。
- System.IO.FileInfoオブジェクトの Attributes プロパティで属性を取得。
サンプルコードは下記の通りです。
static void Main(string[] args) { // この変数でファイルを指定します string file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\test.txt"; System.IO.FileInfo fi = new System.IO.FileInfo(file_path); System.IO.FileAttributes attr1 = System.IO.File.GetAttributes(file_path); // 1つ目の方法 System.IO.FileAttributes attr2 = fi.Attributes; // 2つ目の方法 Console.WriteLine(attr1.ToString()); Console.WriteLine(attr2.ToString()); }
このサンプルでは、テスト用に用意していたテキストファイルで結果は’Archive’とだけ表示されます。
違う結果を見るには
file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\test.txt";
を
file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1";
とすると、’Directory’と表示されます。
これはそれぞれ
Archive | バックアップまたは削除の候補 |
Directory | ディレクトリ |
を指しています。
他にもいろいろありますが、詳細はこちらで
この属性の説明の中に、「Compressed ファイルが圧縮されます。」というものがありますが、これはzip圧縮ファイルやlzh書庫などの「圧縮ファイル」のことではなく、ファイルのプロパティで指定する「内容を圧縮してディスク領域を節約する」でチェックを入れて圧縮したファイルやディレクトリのことです。
属性のチェック方法
属性のチェックは、簡単なようでちょっと面倒です。
下記は間違ったチェック方法です。
System.IO.FileAttributes attr1 = System.IO.File.GetAttributes(file_path); // 1つ目の方法 // ディレクトリかどうかをチェックする間違った例 if(attr1 == System.IO.FileAttributes.Directory) { Console.WriteLine("attr1 is Directory"); }
ディレクトリ属性を持っていれば、このif文の中に入るように見えますが、このif文は ディレクトリ属性”だけ” もっているディレクトリにしか使えません。
圧縮されたディレクトリや、隠しフォルダの場合は、’Directory’属性を持っているのですが、このif文の中に入りません。
こういった複数の属性でもディレクトリ属性を持っていれば、このif文の中に入るようにするには、下記のように実装しなければいけません。
System.IO.FileAttributes attr1 = System.IO.File.GetAttributes(file_path); // 1つ目の方法 // ディレクトリかどうかをチェックする正しい例 if ((attr1 & System.IO.FileAttributes.Directory) == System.IO.FileAttributes.Directory) { Console.WriteLine("attr1 is Directory"); }
C言語をされている方は、もうお分かりだと思います。
このSystem.IO.FileAttributesは、ファイル属性をビットで表現しているのでこのようにして判別しています。