DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ファイルの属性を取得、設定する

ここでは、ファイルの属性を調べる方法と、ファイルに属性を設定する方法を紹介します。

Fileクラスを使用する方法

ファイルの属性を調べるには、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列挙体のすべてのメンバを設定できるわけではありません。設定できるメンバには、上記の表の「説明」に「設定可」と書いておきました。

以下に、ファイルの属性を調べる方法と、ファイルに属性を追加する方法、さらに属性を削除する方法を、具体例で紹介します。

VB.NET
コードを隠すコードを選択
'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#
コードを隠すコードを選択
//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クラスを使用する方法

FileInfoクラスのAttributesプロパティでも同様のことができます。さらに、読み取り専用かを取得、設定するだけならば、IsReadOnlyプロパティが便利です。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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暗号化する」で紹介しています。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。