NTFSでは約32,000文字のパスが許可されていますが、Win32 APIの259文字のパス長制限があります。
Windows API([リンクされたドキュメント]で説明されているいくつかの例外を除く)では、パスの最大長はでMAX_PATH
、これは260文字として定義されています。
(さらにNULL
、パスに終了文字が追加され、259の使用可能な文字が与えられます。)
Explorer(および他のほとんどすべてのWindowsアプリ)はファイルシステムへのアクセスにWin32 APIを使用しているため、可能な場合でもこの制限を回避することは実用的ではありません。
Windows APIには、最大合計パス長が32,767文字の拡張長パスを許可するUnicodeバージョンもある多くの関数があります。このタイプのパスは、バックスラッシュで区切られたコンポーネントで構成され、それぞれlpMaximumComponentLength
がGetVolumeInformation
関数のパラメーターで返される値(この値は通常255文字)までです。拡張長パスを指定するには、「\\?\」プレフィックスを使用します。たとえば、「\\?\ D:\ very long path」。
残念ながら、\\?\D:\very long path
Explorerウィンドウに入力することはできません。アプリケーションは、これらのAPIを利用して非常に長いパス名を処理するように設計する必要があります。
Windowsで拡張長パスにアクセスする1つの方法は、Windows用の* nixエミュレーションレイヤーであるCygwinをインストールすることです。私のテストでは、Cygwinはによって制限されているようには見えませんMAX_PATH
。bashとviには、2,000文字のパスに関する問題はありませんでした。
bashを使用して拡張パスを参照することはできますが、通常のWindowsアプリケーションではこれらのパスのファイルを開くことができない可能性があることに注意してください。たとえばnotepad
、作業ディレクトリが拡張パスであるときに入力すると、
エラー:現在の作業ディレクトリには、Win32作業ディレクトリで許可されているよりも長いパスがあります。ここからネイティブWindowsアプリケーションを起動できません。
また、試しnotepad "\\?\D:\very long path\file.txt"
てもうまくいきません。起動しますが、「ファイルが見つかりません...」と表示されます。Notepad++で同じことをしようとするとクラッシュします。(おそらくバッファオーバーフロー。)
拡張長パスの奥深くに埋め込まれた特定のファイルにアクセスする他のオプションは、NTFS ジャンクションポイントを作成してパス自体を短くすることです。管理者特権のコマンドプロンプトから:
D:\> mklink /J jct "\\?\D:\very\long\path"
D:\very\long\path\
from のコンテンツにアクセスできるようになりましたD:\jct\
。Explorerや他のアプリに関する限り、パスは単なるD:\jct\
(または何でも)であるため、パスの長さの問題は発生しません。NTFSドライバーは、パス(「再解析ポイント」)の透過的なリダイレクトを処理します。
このアプローチの欠点は、アクセスしたいファイルの近くにジャンクションを作成しなければならないことです。まだディレクトリ構造全体を閲覧することはできません。
特殊文字(" * : < > ? \ |
)に関しては、それは単に禁止です。これらの文字はWindows内で特別な意味を持つため、パス内で使用することはできません。(Cygwinでは、特殊文字を使用してファイルを作成できますが、特殊なUnicode文字で文字を置き換えることにより、読み取り時に元に戻します。これらのCygwinで作成されたファイルをLinuxまたはエクスプローラーで表示すると、正しく表示されません。 Unicode文字は置換されません。)
それはすべて、非常に長いパスを必要とする何をしているのですか?おそらく、あなたがやっていることを再評価し、長い道のりを避けることによって、あなたの人生を楽にすることができるでしょう。チャンスはあなたが、ある長いとにかくというパスを必要としません。