web-dev-qa-db-ja.com

\\?\は、ファイルパスの先頭に追加された場合の意味

ログで次の形式のファイルへの参照を見つけました。

\\?\C:\Path\path\file.log

\?\のシーケンスの意味への参照が見つかりません。バックスラッシュの間の部分はホスト名を指していると思います。

たとえば、私のWindowsコンピューターでは、次のようにうまく機能します。

dir \\?\C:\

また、同じ結果で問題ありません:

dir \\.\C:\

質問:

  1. この特定のパス形式で疑問符が意味するものへの参照はありますか?
  2. そのような形式でファイルパスを生成するものは何ですか?
47
bjjer

長い読み物ですが、このドメインにいる場合は読む価値があります: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx

エキス:

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

そして:

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

48
Ferenc Deak

Windows APIは、ファイルI/Oの入力文字列を解析します。特に、名前をNTスタイルの名前に変換するか、/および\疑似ディレクトリを解釈する一環として、...に変換します。いくつかの例外を除き、Windows APIはパス名を260文字に制限しています。

文書化済み\\?\プレフィックスの目的は次のとおりです。

ファイルI/Oの場合、パス文字列の「\\?\」プレフィックスは、Windows APIにすべての文字列解析を無効にし、それに続く文字列をファイルシステムに直接送信するように指示します。

これにより、パス名に.または..を使用できるほか、基になるファイルシステムが長いパスとファイル名をサポートしている場合、260文字のパス名制限を緩和できます。

5
IInspectable