この場合、Hennesが正しく指摘したように、それは明らかにDOS時代から継承された特別な意味についてでしたaux
。ただし、将来これにつまずく読者のために、この動作が見られる可能性のある別のケースを追加したいと思います。
これは、末尾にドットが付いたファイルが作成されたときです。さらにエキゾチックなケースもあります。しかしfilename.ext.
、そのようなファイル名であり、通常はWin32サブシステムから削除できませんでした。これがKaranからのトリックの出番です。S/彼は、Win32サブシステムの下のレイヤーに渡される前に、その\\?\C:\...
形式から「ネイティブ」に変更される名前を使用します(これは、ファイルシステムフィルタードライバーがそれを見る方法でもあります)。形\??\C:\...
。これは、Windowsのバージョンに応じて、いわゆるオブジェクトディレクトリ(Sysinternals / MicrosoftのWinObjを使用してオブジェクトマネージャーの名前空間を確認する)またはシンボリックリンク(Vista以降のNTFSの同じ名前のエンティティと混同しないでください)になります。などの別のオブジェクトディレクトリに\DosDevices
。後者は単なる名前の1つであり、デフォルトでWin32プロセスに表示されるオブジェクトマネージャ名前空間の一部を示します。詳細については、本シリーズのWindows Internalsを確認するか、特にGoogleのProject Zero (Win32からNTへのパス変換に関する決定的なガイド)でパスの解析を参照してください。特に、Win32ファイルネームスペースとWin32デバイスネームスペースの違いに注意する必要がある場合があります。
では、そもそもそのようなファイルをどのように作成するのでしょうか。いくつかの可能性があります。
\\?\X:
パス名にプレフィックスを使用して利用可能なパスの長さを260文字から約32767文字(脚注1を参照)に拡張するWin32プログラムは、最初にファイルを作成し、Win32サブシステムのいくつかの制限を回避しました。
- 別のサブシステムをルートとするプログラム。以前のPOSIXサブシステム(後のInterixは現在SUA)、OS / 2サブシステム(以前は存在していたが、NT 3.51に存在していた)、またはWindowsの意味でのサブシステムではない(Cygwin、私の知る限り)作成されたレイヤーファイルまたはフォルダ。同様に、Windows 10上のWSL(LinuxのWindowsサブシステム)も候補の1つです。
- 別のオペレーティングシステムで作成された(たとえば、並列Linuxブート)。
- Windows以外のサーバーにあるネットワーク共有上のファイルです。
最後の2つのポイントは、言及されている対策の1つを示唆しています。Windows以外のライブCDを起動して、ファイルを削除します。
この問題は、古い非Unicode Win32プログラムが複数のコードページのファイル名に直面する場合と実際に比較できます。多くの場合、それぞれのANSIコードページは256文字しか収められないため、それらの一部を「見つける」ことができませんが、UTF-16(ただし、そのサブセットUCS-2ではありません)は、理論上、事実上無制限の量のコードポイントをエンコードできます。 (unicode.orgとWikipediaでこのトピックについて読んでください)。
これが根本的な問題をもう少し理解するのに役立つことを願っています。この長い回答を他の回答のいずれかに編集したくありませんでしたが、補足するだけです。他の答えはこれなしでも完全に有効です。
脚注1:絶対最大(32767文字)に近いパスは、オブジェクトマネージャーとファイルシステムフィルターまたはファイルシステム自体(たとえば、再解析ポイント)の両方によって拡張される可能性があるため、パスの最大文字数は絶対ではありません。 。