パスの最大長の制限
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:\非常に長いパス" などです。
注意
"\\?\" プレフィックスは実行時にシステムによって長い文字列に拡張される可能性があり、この拡張は全長に適用されるため、最大パスは約 32,767 文字です。
"\\?\" プレフィックスは、汎用名前付け規則 (UNC) に従って構築されたパスでも使用できます。 UNC を使用してこのようなパスを指定するには、"\\?\UNC\" プレフィックスを使用します。 たとえば、"\\?\UNC\server\share" です。ここで、"server" はコンピューターの名前、"共有" は共有フォルダーの名前です。 これらのプレフィックスは、パス自体の一部として使用されません。 これらは、パスを最小限の変更でシステムに渡す必要があることを示します。つまり、パス区切り記号を表すためにスラッシュを使用したり、現在のディレクトリを表すピリオドを使用したり、親ディレクトリを表す二重ドットを使用したりすることはできません。 "\\?\" プレフィックスは相対パスで使用できないため、相対パスは常に 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、FindFirstFileNameW、FindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。