ファイル、パス、および名前空間の名前付け

Windows でサポートされているすべてのファイル システムでは、ファイルとディレクトリの概念を使用して、ディスクまたはデバイスに格納されているデータにアクセスします。 ファイルおよびデバイス I/O 用の Windows API を使用する Windows 開発者は、ファイルとディレクトリの名前のさまざまな規則、規則、制限事項を理解している必要があります。

ファイル I/O API を使用して、ディスク、デバイス、およびネットワーク共有からデータにアクセスできます。 ファイルとディレクトリと名前空間は、パスの概念の一部です。これは、ディスク、デバイス、または特定の操作のネットワーク接続からデータを取得する場所の文字列表現です。

NTFS などの一部のファイル システムでは、リンクされたファイルとディレクトリがサポートされており、通常のファイルやディレクトリと同様に、ファイルの名前付け規則と規則にも従います。 詳細については、「 ハード リンクとジャンクション」およびポイントとファイル操作の再解析」を参照してください。

詳細については、次のサブセクションを参照してください。

長いファイル パスをサポートするようにWindows 10を構成する方法については、「パスの最大長の制限」を参照してください。

ファイル名とディレクトリ名

すべてのファイル システムは、個々のファイルに対して同じ一般的な名前付け規則に従います。基本ファイル名とオプションの拡張子はピリオドで区切られます。 ただし、NTFS、CDFS、exFAT、UDFS、FAT、FAT32 などの各ファイル システムには、ディレクトリまたはファイルへのパス内の個々のコンポーネントの形成に関する特定の異なる規則を持つことができます。 ディレクトリは、ディレクトリとして指定する特殊な属性を持つファイルですが、それ以外の場合は、通常のファイルと同じ名前付け規則すべてに従う必要があります。 ディレクトリという用語は、ファイル システムに関する限り特殊な種類のファイルを単に指すので、一般的な用語ファイルを使用して、ディレクトリとデータ ファイルの両方の概念を含む参照資料もあります。 このため、特に指定がない限り、ファイルの名前付けまたは使用規則または例もディレクトリに適用する必要があります。 path という用語は、1 つ以上のディレクトリ、円記号、および場合によってはボリューム名を指します。 詳細については、「 パス 」セクションを参照してください。

文字数の制限も異なる場合があり、使用されるファイル システムとパス名のプレフィックス形式によって異なる場合があります。 これは、下位互換性メカニズムのサポートによってさらに複雑になります。 たとえば、古い MS-DOS FAT ファイル システムでは、基本ファイル名に最大 8 文字、拡張子が 3 文字で、ドット区切り記号を含む合計 12 文字がサポートされています。 これは一般に 8.3 ファイル名と呼ばれます。 Windows FAT および NTFS ファイル システムは、長いファイル名をサポートしていますが、8.3 バージョンの 長いファイル名を引き続きサポートしているため、8.3 ファイル名に限定されません。

命名規則

次の基本的な規則により、アプリケーションはファイル システムに関係なく、ファイルとディレクトリの有効な名前を作成して処理できます。

  • ピリオドを使用して、ディレクトリまたはファイルの名前の拡張子から基本ファイル名を区切ります。

  • 円記号 (\) を使用して、パスコンポーネントを区切ります。 円記号は、ファイル名をパスからパスに分割し、パス内の別のディレクトリ名から 1 つのディレクトリ名を分割します。 実際のファイルまたはディレクトリの名前に円記号を使用することはできません。これは、名前をコンポーネントに区切る予約文字であるためです。

  • ボリューム名の一部として、必要に応じて円記号を使用します (例: "C:\"は、汎用名前付け規則 (UNC) 名の "\\server\share\path\file" の "C:\path\file" または "\\server\share" です。 UNC 名の詳細については、「 パスの最大長の制限 」セクションを参照してください。

  • 大文字と小文字の区別は想定しないでください。 たとえば、一部のファイル システム (POSIX に準拠したファイル システムなど) ではそれらが異なると見なされる場合でも、名前が OSCAR、Oscar、および oscar が同じであるとします。 NTFS では大文字と小文字が区別される POSIX セマンティクスがサポートされていますが、これは既定の動作ではないことに注意してください。 詳細については、「 CreateFile」を参照してください。

  • ボリューム指定子 (ドライブ文字) でも、大文字と小文字は区別されません。 たとえば、"D:\"および "d:\"は同じボリュームを参照します。

  • 次の点を除き、拡張文字セット (128 から 255) の Unicode 文字と文字など、現在のコード ページの任意の文字を名前に使用します。

    • 次の予約文字:

      • < (より小さい)
      • > (より大きい)
      • : (コロン)
      • " (二重引用符)
      • / (スラッシュ)
      • \ (円記号)
      • |(垂直バーまたはパイプ)
      • ? (疑問符)
      • * (アスタリスク)
    • 整数値 0 。ASCII NUL 文字とも呼ばれます。

    • これらの文字が許可されている代替データ ストリームを除き、整数表現が 1 から 31 の範囲にある文字。 ファイル ストリームの詳細については、「ファイル ストリーム」を参照してください。

    • ターゲット ファイル システムで許可されていないその他の文字。

  • パス内のディレクトリ コンポーネント としてピリオドを使用して、現在のディレクトリ (".\temp.txt" など) を表します。 詳細については、「 パス」を参照してください。

  • パス内のディレクトリ コンポーネント として 2 つの連続するピリオド (..) を使用して、現在のディレクトリの親を表します (例: )。。\temp.txt"。 詳細については、「 パス」を参照してください。

  • ファイルの名前には、次の予約名を使用しないでください。

    CON、PRN、AUX、NUL、COM0、COM1、COM2、COM4、COM4、COM5、COM6、COM7、COM8、COM9、LPT0、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9。 また、これらの名前の直後に拡張子が付かないようにします。たとえば、NUL.txt と NUL.tar.gz はどちらも NUL と同等です。 詳細については、「名前空間」を参照してください。

  • ファイル名またはディレクトリ名をスペースまたはピリオドで終わらせないでください。 基になるファイル システムではこのような名前がサポートされている場合がありますが、Windows シェルとユーザー インターフェイスではサポートされません。 ただし、名前の最初の文字としてピリオドを指定することもできます。 たとえば、".temp" とします。

短い名前と長い名前

長いファイル名は、短い MS-DOS ( 8.3 とも呼ばれます) スタイルの名前付け規則を超える任意のファイル名と見なされます。 長いファイル名を作成すると、Windows によって 8.3 の別名または短い名前と呼ばれる短い 8.3 形式の名前が作成され、ディスクにも格納される場合があります。 この 8.3 エイリアシングは、特定のファイル システムに応じて、システム全体または指定されたボリュームのパフォーマンス上の理由から無効にすることができます。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 8.3 エイリアスは、Windows 7 および Windows Server 2008 R2 まで、指定されたボリュームに対して無効にできません。

多くのファイル システムでは、ファイル名には、名前の各コンポーネント内にチルダ (~) が含まれていますが、名前付け規則 8.3 に準拠するには長すぎます。

注意

すべてのファイル システムがチルダ置換規則に従っているわけではないため、通常はサポートされている場合でも、8.3 別名生成を無効にするようにシステムを構成できます。 そのため、ディスク上に 8.3 エイリアスが既に存在することを前提にしないでください。

 

8.3 ファイル名、長いファイル名、またはファイルの完全パスをシステムから要求するには、次のオプションを検討してください。

  • 長いファイル名の 8.3 形式を取得するには、 GetShortPathName 関数を使用します。
  • 短い名前の長いファイル名バージョンを取得するには、 GetLongPathName 関数を使用します。
  • ファイルへの完全なパスを取得するには、 GetFullPathName 関数を使用します。

NTFS、exFAT、UDFS、FAT32 などの新しいファイル システムでは、Windows は長いファイル名を Unicode でディスクに格納します。つまり、元の長いファイル名は常に保持されます。 これは、ディスクの読み取りまたは書き込み操作中にアクティブになっているコード ページに関係なく、長いファイル名に拡張文字が含まれている場合でも当てはまります。

長いファイル名を使用するファイルは、NTFS ファイル システム パーティションと Windows FAT ファイル システム パーティションの間で、ファイル名情報を失うことなくコピーできます。 これは、以前の MS-DOS FAT および一部の種類の CDFS (CD-ROM) ファイル システムでは、実際のファイル名によっては当てはまらない場合があります。 この場合、可能であれば短いファイル名が置き換えられます。

パス

指定されたファイルへの パス は、特殊文字 (円記号) で区切られた 1 つ以上の コンポーネントで構成され、各コンポーネントは通常ディレクトリ名またはファイル名ですが、以下で説明するいくつかの重要な例外があります。 多くの場合、パスの先頭 ( プレフィックス) がどのようなパスであるかをシステムが解釈することが重要です。 このプレフィックスは、パスで使用されている 名前空間 と、パス内のどの位置で使用される特殊文字 (最後の文字も含む) を決定します。

パスのコンポーネントがファイル名の場合は、最後のコンポーネントである必要があります。

パスの各コンポーネントは、特定のファイル システムに指定された最大長によっても制限されます。 一般に、これらのルールは shortlong の 2 つのカテゴリに分類されます。 ディレクトリ名は特殊な種類のファイルとしてファイル システムによって格納されますが、ファイルの名前付け規則もディレクトリ名に適用されることに注意してください。 要約すると、パスは、特定のファイル名またはディレクトリ名に存在するすべてのディレクトリ間の階層の文字列表現にすぎません。

完全修飾パスと相対パス

ファイルを操作する Windows API 関数の場合、多くの場合、ファイル名は現在のディレクトリに対して相対的に指定できますが、一部の API には完全修飾パスが必要です。 ファイル名は、次のいずれかで始まらない場合、現在のディレクトリに対して相対的です。

  • 任意の形式の UNC 名。常に 2 つの円記号 ("\\") で始まります。 詳細については、次のセクションを参照してください。
  • 円記号 ("C:\" など) を含むディスク指定子または "d:\"
  • 1 つの円記号 ("\directory" や "\file.txt" など)。 これは 絶対パスとも呼ばれます。

ファイル名がディスク指定子のみで始まり、コロンの後の円記号で始まる場合は、ドライブ上の現在のディレクトリへの相対パスとして、指定した文字で解釈されます。 現在のディレクトリは、そのディスクでの最新の "ディレクトリの変更" 操作中に設定された内容に応じて、ルート ディレクトリである場合とそうでない場合があることに注意してください。 この形式の例を次に示します。

  • "C:tmp.txt" は、ドライブ C の現在のディレクトリにある "tmp.txt" という名前のファイルを指します。
  • "C:tempdir\tmp.txt" は、ドライブ C の現在のディレクトリのサブディレクトリ内のファイルを指します。

パスに "二重ドット" が含まれている場合は相対パスとも言われます。つまり、パスの 1 つのコンポーネントに 2 つのピリオドが一緒に含まれます。 この特殊指定子は、現在のディレクトリの上のディレクトリを示すために使用されます。それ以外の場合は "親ディレクトリ" と呼ばれます。 この形式の例を次に示します。

  • "..\tmp.txt" は、現在のディレクトリの親にある tmp.txt という名前のファイルを指定します。
  • "..\..\tmp.txt" は、現在のディレクトリの上にある 2 つのディレクトリであるファイルを指定します。
  • "..\tempdir\tmp.txt" は、現在のディレクトリのピア ディレクトリである tempdir という名前のディレクトリにある tmp.txt という名前のファイルを指定します。

相対パスでは、"C:..\tmp.txt" など、両方の型の例を組み合わせることができます。 これは、システムは現在のドライブとそのドライブの現在のディレクトリを追跡しますが、現在のドライブとして設定されているドライブ指定子に関係なく、(システムに複数のドライブ文字がある場合)、それぞれのドライブ文字の現在のディレクトリも追跡するため便利です。

パスの最大長の制限

バージョン 1607 より前Windows 10 Windows のエディションでは、パスの最大長はMAX_PATHで、260 文字として定義されます。 それ以降のバージョンの Windows では、レジストリ キーを変更するか、グループ ポリシー ツールを使用して制限を削除する必要があります。 詳細については、「 パスの最大長の制限」 を参照してください。

名前空間

Windows API で使用される名前空間規則には、主に NT 名前空間Win32 名前空間と呼ばれる 2 つの主要なカテゴリがあります。 NT 名前空間は、Win32 サブシステムや拡張によって Win32 名前空間など、他のサブシステムと名前空間が存在する可能性がある最も低いレベルの名前空間として設計されました。 POSIX は、NT 名前空間の上に構築された Windows のサブシステムのもう 1 つの例です。 また、Windows の初期バージョンでは、通信 (シリアルおよび並列) ポートや既定の表示コンソールなどの特定の特殊なデバイスの定義済み (予約済み) 名も NT デバイス名前空間と呼ばれ、下位互換性のために現在のバージョンの Windows で引き続きサポートされています。

Win32 ファイルの名前空間

Win32 名前空間のプレフィックスと規則については、このセクションと次のセクションで概要を示し、その使用方法について説明します。 これらの例は、Windows API 関数での使用を目的としており、Windows エクスプローラーなどの Windows シェル アプリケーションで動作するとは限らないことに注意してください。 このため、Windows シェル アプリケーションから通常使用できるパスよりも広範なパスがあり、これを利用する Windows アプリケーションは、これらの名前空間規則を使用して開発できます。

ファイル I/O の場合、パス文字列の "\\?\" プレフィックスは、Windows API に対して、すべての文字列解析を無効にし、その後に続く文字列をファイル システムに直接送信するように指示します。 たとえば、ファイル システムで大きなパスとファイル名がサポートされている場合は、Windows API によって適用される MAX_PATH 制限を超える可能性があります。 通常の最大パス制限の詳細については、前のセクション「 最大パス長の制限」を参照してください。

パス文字列の自動展開がオフになるため、"\\?\" プレフィックスではパス名に ".." と "." を使用することもできます。これは、完全修飾パスの一部としてこれらの予約相対パス指定子を持つファイルに対して操作を実行しようとすると便利です。

多くのファイル I/O API で "\\?\" がサポートされているわけではありません。各 API のリファレンス トピックを確認する必要があります。

Unicode API を使用して、"\\?\" プレフィックスでMAX_PATHを超える可能性があることを確認する必要があることに注意してください。

Win32 デバイス名前空間

"\\.\" プレフィックスは、Win32 ファイル名前空間ではなく Win32 デバイス名前空間にアクセスします。 これは、API がこの種類のアクセスをサポートしている場合に、ファイル システムを経由せずに物理ディスクとボリュームへのアクセスを直接行う方法です。 この方法でディスク以外の多くのデバイスにアクセスできます (たとえば、 CreateFile 関数と DefineDosDevice 関数を使用)。

たとえば、システムのシリアル通信ポート 1 を開く場合は、 CreateFile 関数の呼び出しで "COM1" を使用できます。 これは、COM1–COM9 が NT 名前空間の予約名の一部であるために機能しますが、"\\.\" プレフィックスを使用すると、これらのデバイス名でも機能します。 これに対し、100 ポートのシリアル拡張ボードがインストールされていて、COM56 を開きたい場合は、COM56 用に定義済みの NT 名前空間がないため、"COM56" を使用して開くことはできません。 "\\.\COM56" を使用して開く必要があります。これは、"\\.\" が定義済みのエイリアスを見つけずにデバイス名前空間に直接移動するためです。

Win32 デバイス名前空間を使用する別の例として、 CreateFile 関数と "\\.\PhysicalDriveX" ( X は有効な整数値) または "\\.\CdRomX" を使用します。 これにより、ファイル システムをバイパスして、これらのデバイスに直接アクセスできます。 これは、これらのデバイス名は、これらのデバイスが列挙されるとシステムによって作成され、一部のドライバーはシステム内に他のエイリアスも作成されるために機能します。 たとえば、"C:\" という名前を実装するデバイス ドライバーには、ファイル システムでもある独自の名前空間があります。

CreateFile 関数を使用する API は、使用するパラメーターに応じて、ファイルとデバイスの両方を開くために使用される関数であるため、通常は "\\.\" プレフィックスで動作します。

Windows API 関数を使用している場合は、"\\.\" プレフィックスを使用して、ファイルではなくデバイスにのみアクセスする必要があります。

ほとんどの API では "\\.\" はサポートされません。デバイス名前空間で動作するように設計されたものだけが、それを認識します。 各 API の参照トピックを必ず確認してください。

NT 名前空間

NT 名前空間規則の使用を許可する API もありますが、ほとんどの場合、Windows オブジェクト マネージャーによって不要になります。 説明するために、Windows Sysinternals WinObj ツールを使用して、システム オブジェクト ブラウザーで Windows 名前空間を参照すると便利です。 このツールを実行すると、ルートから始まる NT 名前空間 ("\" ) が表示されます。 "Global??" というサブフォルダーは、Win32 名前空間が存在する場所です。 名前付きデバイス オブジェクトは、"Device" サブディレクトリ内の NT 名前空間に存在します。 ここでは、システムに存在する場合は、最初の 2 つの COM ポートを表すデバイス オブジェクトである Serial0 と Serial1 も見つかる場合があります。 ボリュームを表すデバイス オブジェクトは"HarddiskVolume1" のようになりますが、数値サフィックスは異なる場合があります。 サブディレクトリ "Harddisk0" の下の名前 "DR0" は、ディスクを表すデバイス オブジェクトの例です。

これらのデバイス オブジェクトに Windows アプリケーションからアクセスできるようにするために、デバイス ドライバーは Win32 名前空間の "Global??" に、それぞれのデバイス オブジェクトへのシンボリック リンク (シンボリック リンク) を作成します。 たとえば、"Global??" サブディレクトリの COM0 と COM1 は、単に Serial0 と Serial1 へのシンボリック リンクであり、"C:" は HarddiskVolume1 へのシンボリック リンク、"Physicaldrive0" は DR0 へのシンボリック リンクなどです。 シンボリック リンクがないと、指定したデバイス "Xxx" は、前述のように Win32 名前空間規則を使用する Windows アプリケーションでは使用できません。 ただし、"\Device\Xxx" 形式の NT 名前空間絶対パスをサポートする API を使用して、そのデバイスに対してハンドルを開く可能性があります。

ターミナル サービスと仮想マシンを介したマルチユーザー サポートの追加により、Win32 名前空間内のシステム全体のルート デバイスを仮想化することがさらに必要になりました。 これは、"GLOBALROOT" という名前のシンボリック リンクを Win32 名前空間に追加することで実現されました。これは、前述の WinObj ブラウザー ツールの "Global??" サブディレクトリに表示され、パス "\\?\GLOBALROOT" を介してアクセスできます。 このプレフィックスを使用すると、その後のパスが、セッション依存パスではなく、システム オブジェクト マネージャーの実際のルート パス内で検索されます。

ファイル システムの機能の比較