ここでは、ファイルの属性を調べる方法と、ファイルに属性を設定する方法を紹介します。
ファイルの属性を調べるには、File.GetAttributesメソッドを使います。GetAttributesメソッドはFileAttributes列挙体を返し、これを調べることでファイルの属性が分かります。
FileAttributes列挙体のメンバと意味は次のようなものです(MSDNからの抜粋)。
メンバ名 | 説明 |
---|---|
ReadOnly | ファイルは読み込み専用です。設定可。 |
Hidden | ファイルは隠しファイルです。したがって通常のディレクトリ リストには表示されません。設定可。 |
System | システム ファイルです。このファイルはオペレーティング システムの一部です。またはオペレーティング システムが排他的に使用します。設定可。 |
Directory | このファイルはディレクトリです。フォルダに単独でのみ(付加ではなく)設定可。 |
Archive | ファイルのアーカイブ状態。アプリケーションは、この属性を使用してバックアップや削除の対象となるファイルをマークします。設定可。 |
Device | 今後使用するために予約されています。 |
Normal | 標準のファイルであり、他の属性セットは持ちません。この属性は単独で使用した場合だけ有効です。単独でのみ(付加ではなく)設定可。 |
Temporary | 一時ファイルです。ファイル システムは、アクセス速度を上げるために、データをフラッシュして大容量ストレージに返すのではなく、すべてのデータをメモリに保持しようとします。一時ファイルが不要になったときは、すぐにアプリケーションで削除します。ファイルに設定可。 |
SparseFile | スパース ファイルです。スパース ファイルは、通常、データの大部分が 0 である大きなファイルです。 |
ReparsePoint | ファイルには、ファイルまたはディレクトリに関連付けられたユーザー定義のデータ ブロックである、リパース ポイントが含まれています。 |
Compressed | ファイルは圧縮されています。 |
Offline | ファイルはオフラインです。オフラインのファイルのデータは、即時には使用できません。設定可。 |
NotContentIndexed | ファイルには、オペレーティング システムの内容インデックス付けサービスによるインデックスは付いていません。(ファイルのプロパティの「検索を速くするため、このファイルにインデックスを付ける」の選択を解除する)設定可。 |
Encrypted | ファイルまたはディレクトリは暗号化されています。ファイルの場合は、ファイルのすべてのデータが暗号化されています。ディレクトリの場合は、新規作成されるファイルおよびディレクトリが既定で暗号化されます。 |
ファイルには複数の属性が付いている可能性があります。よって、GetAttributesメソッドの返す値は、これらの値のビットごとの組み合わせとなります。例えば、ファイルに読み込み専用と隠し属性だけが付いている場合、GetAttributesメソッドが返す値は、「FileAttributes.ReadOnly Or FileAttributes.Hidden」(C#では、「FileAttributes.ReadOnly | FileAttributes.Hidden」)となります。
ファイルに属性を設定するには、File.SetAttributesメソッドを使います。設定する属性は、FileAttributes列挙体で指定します。
ただし、FileAttributes列挙体のすべてのメンバを設定できるわけではありません。設定できるメンバには、上記の表の「説明」に「設定可」と書いておきました。
以下に、ファイルの属性を調べる方法と、ファイルに属性を追加する方法、さらに属性を削除する方法を、具体例で紹介します。
'C:\test.txt の属性を取得する Dim attr As System.IO.FileAttributes = System.IO.File.GetAttributes("C:\test.txt") '読み取り専用属性があるか調べる If (attr And System.IO.FileAttributes.ReadOnly) = _ System.IO.FileAttributes.ReadOnly Then Console.WriteLine("読み取り専用属性があります。") End If '読み取り専用属性を追加する System.IO.File.SetAttributes("C:\test.txt", _ attr Or System.IO.FileAttributes.ReadOnly) '読み取り専用属性を削除する System.IO.File.SetAttributes("C:\test.txt", _ attr And (Not System.IO.FileAttributes.ReadOnly)) '読み取り専用属性があれば削除し、なければ追加する System.IO.File.SetAttributes("C:\test.txt", _ attr Xor System.IO.FileAttributes.ReadOnly)
//C:\test.txt の属性を取得する System.IO.FileAttributes attr = System.IO.File.GetAttributes(@"C:\test.txt"); //読み取り専用属性があるか調べる if ((attr & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) { Console.WriteLine("読み取り専用属性があります。"); } //読み取り専用属性を追加する System.IO.File.SetAttributes(@"C:\test.txt", attr | System.IO.FileAttributes.ReadOnly); //読み取り専用属性を削除する System.IO.File.SetAttributes(@"C:\test.txt", attr & (~System.IO.FileAttributes.ReadOnly)); //読み取り専用属性があれば削除し、なければ追加する System.IO.File.SetAttributes(@"C:\test.txt", attr ^ System.IO.FileAttributes.ReadOnly);
FileInfoクラスのAttributesプロパティでも同様のことができます。さらに、読み取り専用かを取得、設定するだけならば、IsReadOnlyプロパティが便利です。
'FileInfoオブジェクトを作成 Dim fi As New System.IO.FileInfo("C:\test.txt") '隠し属性があるか調べる If (fi.Attributes And System.IO.FileAttributes.Hidden) = _ System.IO.FileAttributes.Hidden Then Console.WriteLine("隠し属性があります。") End If '隠し属性を追加する fi.Attributes = fi.Attributes Or System.IO.FileAttributes.Hidden '隠し属性を削除する fi.Attributes = fi.Attributes And Not System.IO.FileAttributes.Hidden '読み取り専用属性を付ける fi.IsReadOnly = True
//FileInfoオブジェクトを作成 System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\test.txt"); //隠し属性があるか調べる if ((fi.Attributes & System.IO.FileAttributes.Hidden) == System.IO.FileAttributes.Hidden) { Console.WriteLine("隠し属性があります。"); } //隠し属性を追加する fi.Attributes |= System.IO.FileAttributes.Hidden; //隠し属性を削除する fi.Attributes &= ~System.IO.FileAttributes.Hidden; //読み取り専用属性を付ける fi.IsReadOnly = true;
補足:FileInfoクラスは、ファイル情報を返すプロパティ(Attributes、LastWriteTimeなど)から最初に値を取得したときにキャッシュを作成し、2回目以降に値を取得するときはキャッシュされた情報を返します。よってこれらのプロパティは、現在の情報ではなく、古い情報を返す可能性があります。最新の情報を取得するためにキャッシュを最新にするには、Refreshメソッドを呼び出します。なおこれらのプロパティに値を設定したときは、キャッシュが削除されます。
「ファイルやフォルダをNTFS圧縮する」で紹介しています。
「ファイルやフォルダをNTFS暗号化する」で紹介しています。