Windowsでは、いつ「\\\\?\\」ファイル名プレフィックスを使用する必要がありますか?

StackOverflow https://stackoverflow.com/questions/341550

質問

Unicodeファイル名でファイルを開くためのcライブラリに出くわしました。ファイルを開く前に、まず「\\?」を先頭に付けてファイル名をパスに変換します。このmsdnの記事

これらの「\\?\」パスには、UnicodeバージョンのWindowsAPIと標準ライブラリが必要なようです。

役に立ちましたか?

解決

はい、それはその目的のためだけです。ただし、MAX_PATHの長さを超えるパスを作成する場合は、互換性の問題が発生する可能性があります。たとえば、エクスプローラシェルとコマンドプロンプト(少なくともXPでは、Vistaについてはわかりません)は、その長さを超えるパスを処理できず、エラーを返します。

他のヒント

この方法の最適な使用法は、おそらく新しいファイルを作成することではなく、他の誰かが作成した可能性のある既存のファイルを管理することです。

私は、path_length > MAX_PATHを含むファイルを定期的に取得するファイルサーバーを管理していました。ご覧のとおり、ユーザーはファイルをH:\myfile.txtと見なしていましたが、サーバー上では実際にはH:\users\username\myfile.txtでした。したがって、ユーザーが正確にMAX_PATH文字を使用してファイルを作成した場合、サーバー上ではそれはMAX_PATH+len("users\username")でした。

(Internet ExplorerでWebページを保存すると、ファイル名としてページタイトルが使用されるため、MAX_PATH文字を使用してファイルを作成することはそれほど珍しくありません。これは、ページによってはかなり長くなる可能性があります)。

また、ドライブを(ネットワークまたはUSB経由で)MacまたはLinuxマシンと共有すると、con、prn、lpt1などの名前のファイルを見つけることができます。繰り返しになりますが、プレフィックスを使用すると、スクリプトでこれらのファイルを処理できます。

最初に注意すべきことは、「\\?\」はパスをUNCパスにしないということです。2回目にUNC- スタイルパスと呼んだときは、より正確でした。しかし、それでも、類似性は最初に2つの円記号があることからのみ生じます。それは本当にUNCとは何の関係もありません。これは、プレフィックスが「\\?」のUNCパスを取得するためにさらに文字を使用する必要があるという事実によって裏付けられています。

そのプレフィックスを使用する理由はすべてあると思います。引用した記事で説明されているように、最大長の制限が解除されます。また、Unicodeパスにのみ適用されます。Unicode以外のパスは、そのプレフィックスを使用しても制限を回避できません。

注意すべき点の1つは、プレフィックスは相対パスでは許可されておらず、絶対パスでのみ許可されていることです。Cライブラリがその制限を順守していることを再確認することをお勧めします。

より長いパスを許可するだけでなく、「\\?\」プレフィックスを使用すると、「con」や「aux」などのファイルやディレクトリ名を使用することもできます。通常、Windowsはそれらを昔ながらのDOSデバイスとして解釈します。

私は1995年からWindowsコードを書いています。そのプレフィックスは知っていますが、それを使用する理由は見つかりませんでした。私の知る限り、MAX_PATHを超えてパスの長さを長くすることが唯一の理由のようであり、私もプログラムの顧客もこれまでにそうしていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top