torutkのブログ

ソフトウェア・エンジニアのブログ

Windowsのディレクトリ構成ガイドライン

Windows Vista/7 になって、ユーザーのディレクトリがC:\Users下になったり、C:\Users\<ユーザー名>\AddDataなるディレクトリが出来たり、C:\ProgramDataなるディレクトリが出来たり、といろいろな変化があります。

また、C:\Program Filesの下にインストールしたプログラムの設定ファイルを変更すると、C:\Users\<ユーザー名>\AppData\Local\VirtualStore\Program Files\foo\foo.ini などに書かれたりします。

そのような状況で、開発したプログラムをどこにインストールするように設定すればいいのか、Windowsの流儀が分からず、調べてみると、"Namespace Usage Guidelines for the Window Vista File System"という技術文書に行き当たりました。

アプリケーション開発者向けに、アプリケーション管理データ、ユーザーデータ(ユーザー固有・ユーザー間で共有)、コンピュータ間で共有データ、などの配置についてのガイドラインが掲載されています。

ガイドライン抜粋

Program Files、ユーザー固有・アプリケーション共有データ
  • C:\Program Files:
    • プログラム、ソフトウェアコンポーネント置き場
    • 通常ユーザーはこの場所に書き込み権を持たないため、ユーザーデータやアプリケーションデータはここへ置くべきでない。
  • C:\ProgramData:
    • コンピューター上のすべてのユーザーが共有するアプリケーションデータ置き場
  • C:\Users\<ユーザー名>\AppData:
    • ユーザー固有のアプリケーションデータ置き場
    • AppData以下はさらに階層構造を持つ
  • C:\Uses\<ユーザー名>\AppData\Roaming
    • コンピュータに依存しないユーザー固有のアプリケーションデータ置き場
    • アプリケーションデータのうち、ユーザーカスタマイズ情報などで、ユーザーの操作を伴い変更するもの
  • C:\Uses\<ユーザー名>\AppData\Local
    • このコンピュータに固有のユーザー固有のアプリケーションデータ置き場
    • アプリケーションデータのうち、一時的で破棄されてもアプリケーション動作に支障のないもの(ログ、デバッグ情報など)
    • コンピュータに依存しないユーザー固有のアプリケーションデータでも、ユーザーの操作なしに再生成できるデータ(ユーザーが作成するカスタマイズ情報や設定情報は含まない)
  • C:\Users\<ユーザー名>\AppData\LocalLow
    • ユーザー固有の特権(管理者権限)なしに扱えるアプリケーションデータ

ProgramDataおよびAppDataのサブフォルダ生成規約

  1. ベンダー名+製品代表名(推奨)
  2. 必要があれば、製品内訳名(オプション)
    • 例)C:\ProgramData\Microsoft\Office\Groove
    • 例)AppData\Roaming\Microsoft\Office\Groove+ 必要があれば、バージョン+SKU情報(オプション)
    • 例)C:\ProgramData\Microsoft\Office\Groove\2007 Ultimate Edition
    • 例)AppData\Roaming\Microsoft\Office\Groove\2007 Ultimate Edition
推奨しない使い方
  • C:\Users\<ユーザー名>直下にファイルを置かない。サブフォルダを作り、その中にファイルを入れる
  • システムドライブのルート直下にファイルやフォルダを作らない。
フォルダの移動

アプリケーションは、ユーザーがフォルダーを移動してもよいように備える。移動可能なフォルダーはWell Known Folderと呼ばれ、フォルダーの位置は、Known Folder APIで取得できる。
また、APIが利用できない場合に、環境変数が用意されている

環境変数 場所の例
%USERPROFILE% C:\Users\<ユーザー名>\
%APPDATA% C:\Users\<ユーザー名>\AppData\Roaming
%TEMP% C:\Users\<ユーザー名>\AppData\Local\Temp
%LOCALAPPDATA% C:\Users\<ユーザー名>\AppData\Local
%PUBLIC% C:\Users\Public
%PROGRAMDATA% C:\ProgramData