【元記事をASCII.jpで読む】

 多くのファイルシステムでは、メタ情報としてファイルの属性(Attribute、アトリビュート)をサポートしている。ファイル属性とは、たとえば、「読み出し専用」や「隠しファイル」などのファイルやディレクトリのあり方を示すものだ。今回は、このファイル属性を考えていく。

あらためてWindowsのファイル属性を整理する

 以下の表は、Windowsのファイル属性の一覧である。左端の列挙値は、Windowsのファイルシステムで利用する属性であり、たとえば、ReFS専用の属性などもこれに含まれている。

 原則的にここにあるファイル属性が現在のWindowsが扱うファイル属性である。なお、これは、Windows SDKにある「WinNT.h」で定義されている。

●ファイル属性定数 (WinNT.h)
 https://learn.microsoft.com/ja-jp/windows/win32/fileio/file-attribute-constants

 その横は、System.IO.FileAttributes 列挙型で定義されているもの。こちらは、.NETや.NET Framework(以下、NET版列挙型)で扱える。

●FileAttributes 列挙型
 https://learn.microsoft.com/ja-jp/dotnet/api/system.io.fileattributes?view=netframework-4.8.1

 ただし、.NET版列挙型は、WinNT.hで定義されているすべてのファイル属性には対応しているわけではない。とはいえ、対応していないのはOneDrive関係で追加された属性などで、それらはエクスプローラーからユーザーが手動設定したりする。

 ファイル属性で注意が必要なのは、「圧縮」と「暗号化」だ。これらは属性として定義されているものの、属性を変更すれば、勝手に圧縮や暗号化がなされるのではなく、これらの処理と合わせて属性を変更する。

 エクスプローラーからユーザーがプロパティを操作して設定する場合には、圧縮、暗号化(あるいは解凍、解読)処理がされるになっている。しかし、単なるファイル属性変更だけでは、処理が自動的に起動するわけではないので注意が必要だ。

 ファイル属性には、整数値が対応しており、32bitで2進数表現したときにお互いにぶつからないように配置してある。このため、1つのファイル/ディレクトリに対して複数のファイル属性を設定できる。論理的には、1つのファイルやディレクトリにすべての属性を指定可能である。しかし、属性によっては、ファイルやディレクトリ、ファイルシステムなどの対象が限定されているものがあるため、すべてを1つのファイルに指定することはできない。

ファイル属性を変更する方法

 現在のWindows 11でファイル属性を変更するには、いくつか方法がある。それぞれ設定が可能なファイル属性の種類が異なり、どれを使っても同じ結果が得られるとは限らない。

 ファイル属性を変更する方法には、以下の3つがある。

Set-ItemProperty、Get-ItemPropertyコマンド(PowerShell
attrib.exe(cmd.exe)
エクスプローラー

 現在の標準コマンドライン・インタプリタであるWindows PowerShell(およびPowerShell)では、Set-ItemProperty、Get-ItemPropertyコマンドを使ってファイル属性を設定する。

 ただし、Set-ItemPropertyコマンドでは、先ほどの表のFileAttributes列にある5つのファイル属性(ArchiveHidden、Normal、ReadOnly、System)しか設定できない。

 基本的な構文は、

Set-ItemProperty -Name Attributes -Value "Hidden,System" -Path .\test.txt

である。-Valueオプションに文字列として4つの属性を指定する。複数指定したいときには、カンマでつなげる。

 ただし、Set-ItemPropertyは、ファイル属性を個別に指定してオフにすることができないため、ファイル属性がまったく指定されていない状態を表す「Normal」を使う。これですべての属性をオフにして、必要に応じて他の属性を設定する。このあたりを見るに、コマンドの設計を失敗している感じがある。後述するattrib.exeを使った方が簡単である。

 Get-ItemPropertyで対応外のファイル属性が含まれているとき、表示はファイル属性を数値で表示する。なお、表示だけなら、Get-ChildItem(エイリアスはdir)やGet-Itemコマンドでもできる。このコマンドで得られたFileInfoオブジェクトに対して、Attributesプロパティを表示させればよい。

 attrib.exehttps://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/attrib)は、MS-DOS時代からあるファイル属性を設定、表示するコマンドである。属性を変更する場合、属性を表すアルファベット1文字に「+」(オン、設定)、「-」(オフ、解除)を付けて、対象へのパスを記述する。

ATTRIB [+<属性文字> | -<属性文字>]……[パス] [/S [/D]] [/L]

 PowerShell内でも、属性の指定は、attribコマンドを使った方が便利だ。

 エクスプローラーは、簡易なファイル属性指定ができるが、前記2つのコマンドでは、設定できないOneDrive関連のファイル属性を右クリックメニューから指定できる。

 属性指定は、ファイルを選択しそのプロパティを開いてする。指定可能なのは「読み取り専用」「隠しファイル」「アーカイブ対象」「圧縮」「インデックス作成」「暗号化」の6つである。

言語からファイル属性を扱う

 コンピュータ言語からファイル属性を扱うには、以下の2つのAPIがある。

Win32API:GetFileInformationByHandleEx、SetFileInformationByHandle
.NET:GetAttributes、SetAttributesメソッド(System.IO.Fileクラス)

 これらは、なんらかのコンピュータ言語から呼び出す必要があるが、言語によっては、コマンドラインから呼び出すことも可能だ。たとえば、.NETのGetAttributes、SetAttributesメソッドは、コマンドラインでPowerShellから呼び出すことができる。

 たとえば、

[System.IO.File]::SetAttributes(<フルパス>,
    ([System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Hidden ))

とする。「[System.IO.FileAttributes]」に関しては冒頭の表を参照してほしい。APIを使うメリットは、コマンドやGUIでは扱えないファイル属性を利用できる点にある。

 ファイル属性は、読み取り専用や隠しファイルといった簡単なものだけで使われていたが、OneDriveの導入などで多数のファイル属性が導入されて、数が増えている。

気づけば随分数が増えているWindowsのファイル属性