パスの最大長の制限

Windows API (以下の段落で説明するいくつかの例外を除く) では、パスの最大長は MAX_PATHされ、260 文字として定義されます。 ローカル パスは、ドライブ文字、コロン、円記号、円記号で区切られた名前コンポーネント、および終端の null 文字の順序で構成されます。 たとえば、ドライブ D の最大パスは "D:\some 256 文字パス文字列<NUL>" です。ここで、"<NUL>" は現在のシステム コード ページの非表示の終端 null 文字を表します。 (文字 <> はここでは視覚的にわかりやすくするために使用され、有効なパス文字列の一部にすることはできません)。

たとえば、長いファイル名を持つ git リポジトリを、それ自体が長い名前のフォルダーに複製する場合、この制限に達する可能性があります。

注意

Windows API のファイル I/O 関数は、次のセクションで詳しく説明するように"\\?\" プレフィックスを使用する場合を除き、名前を NT スタイルの名前に変換する一環として "/" を "\" に変換します。

Windows API には、最大合計パス長 32,767 文字の拡張長パスを許可する Unicode バージョンも含まれる多くの関数があります。 この種類のパスは、円記号で区切られたコンポーネントで構成されます。各コンポーネントは、GetVolumeInformation 関数の lpMaximumComponentLength パラメーターで返される値までです (この値は一般的に 255 文字です)。 拡張長パスを指定するには、"\\?\" プレフィックスを使用します。 たとえば、"\\?\D:\very long path" です。

注意

"\\?\" プレフィックスは実行時にシステムによって長い文字列に拡張される可能性があり、この拡張は全長に適用されるため、最大パスは 32,767 文字です。

"\\?\" プレフィックスは、汎用名前付け規則 (UNC) に従って構築されたパスでも使用できます。 UNC を使用してこのようなパスを指定するには、"\\?\UNC\" プレフィックスを使用します。 たとえば、"\\?\UNC\server\share" です。ここで、"server" はコンピューターの名前、"share" は共有フォルダーの名前です。 これらのプレフィックスは、パス自体の一部として使用されません。 これらは、パスを最小限の変更でシステムに渡す必要があることを示します。つまり、スラッシュを使用してパスの区切り記号を表したり、現在のディレクトリを表すピリオドを使用したり、親ディレクトリを表す二重ドットを使用したりすることはできません。 "\\?\" プレフィックスは相対パスで使用できないため、相対パスは常に MAX_PATH 文字の合計に制限されます。

ファイル システムはパスとファイル名を WCHARの不透明なシーケンスとして扱うため、Windows ファイル I/O API 関数で使用するために、パスとファイル名の文字列に対して Unicode 正規化を実行する必要はありません。 アプリケーションで必要な正規化は、関連する Windows ファイル I/O API 関数の呼び出しの外部で、これを念頭に置いて実行する必要があります。

API を使用してディレクトリを作成する場合、指定したパスに 8.3 のファイル名を追加できない長さ (つまり、ディレクトリ名は MAX_PATH から 12 を引いた値を超えることはできません) にすることはできません。

シェルとファイル システムの要件は異なります。 シェル ユーザー インターフェイスが正しく解釈できないパスを Windows API で作成できます。

Windows 10 バージョン 1607 以降で長いパスを有効にする

Windows 10 バージョン 1607 以降では、一般的な Win32 ファイルおよびディレクトリ関数からMAX_PATH制限が削除されました。 ただし、新しい動作にオプトインする必要があります。

新しい長いパスの動作を有効にするには、次の両方の条件を満たす必要があります。

  • レジストリ キー Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD) が存在し、1 に設定されている必要があります。 キーの値は、影響を受ける Win32 ファイルまたはディレクトリ関数の最初の呼び出しの後にシステム (プロセスごと) によってキャッシュされます (関数の一覧については、以下を参照してください)。 レジストリ キーは、プロセスの有効期間中に再読み込みされません。 システム上のすべてのアプリがキーの値を認識するには、キーが設定される前に一部のプロセスが開始されている可能性があるため、再起動が必要になる場合があります。

また、このコードを設定できるファイルに .reg コピーすることも、昇格された特権を持つターミナル ウィンドウから PowerShell コマンドを使用することもできます。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

注意

このレジストリ キーは、 でグループ ポリシーComputer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long pathsを使用して制御することもできます。

  • アプリケーション マニフェストには、 longPathAware 要素も含める必要があります。

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
            <ws2:longPathAware>true</ws2:longPathAware>
        </windowsSettings>
    </application>
    

これらは、長いパスの動作にオプトインする場合に MAX_PATH 制限がなくなったディレクトリ管理機能です:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW。

これらは、長いパスの動作にオプトインする場合に MAX_PATH 制限がなくなったファイル管理機能です。CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、 CreateSymbolicLinkW、DeleteFileW、FindFirstFileW、FindFirstFileExW、FindNextFileW、GetFileAttributesW、GetFileAttributesExW、SetFileAttributesW、GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileW、FindFirstFileW、およびFindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。