web-dev-qa-db-ja.com

私のWindowsマシンでは、私は4ドットの名前を持ったフォルダを持っていました。

フォルダ名は、単なる4つのドット....でファイルエクスプローラに表示されていました。

私がそれを開こうとしたとき、私は何度も何度もまったく同じフォルダを開いていた無限のウサギの穴の輪に入った - 私はこれを際限なく行うことができた。 C:\ExamplePath\....\....\....\....\....などのようなパスを表示する.

ある特定のプロジェクトでTypeScriptのコンパイルが中断していました。このフォルダとそれに関連する問題が見つかるまでに1年以上かかりました。ネストされたフォルダに深く根ざしていたからです。私はこのような問題を予想したことがなかったので、私はそれを捜したことがなかった。

特別な名前のため、フォルダを通常の方法で削除できませんでした。最後に、コマンドラインを使用して親フォルダをrd /s /q pathで削除することで削除できます。

その後、フォルダを再度作成しようとしましたが、ファイルエクスプローラとコマンドラインの両方では作成できませんでした。

私が20年以上もの間Windowsを使ってきた中で、私はこれまでにこのバグを見たことがないので、アマチュアユーザーにとっては本当に迷惑で混乱を招く問題になると思います。

これがどのように発生した可能性があるか、およびこの問題を再現する方法を誰かが知っていますか?

更新

興味のある人のために:このパスはTFSフォルダの奥深くにあります。そのため、おそらくTFSは@grawityで説明されたバイパス方法を使用します( "さまざまなファイルマネージャ、アーカイバなど"

まれなTFSのバグに遭遇しましたか?

197
Dirk Boer

Win32では、名前が.で終わるファイルやフォルダを作成することはできません。すべてのドットは末尾から削除されます。 test.を作成しようとすると、代わりにtestが表示されます。 (これは古いDOS/Win9x時代のソフトウェアの8.3の名前との互換性のためです。)

その結果、....という名前のフォルダにアクセスしようとするたびに、その名前は空の文字列になり、以前のフォルダに戻ります。

しかし、NTカーネルはそのような名前を許可しています。 Win32 APIによるファイル名の制限を回避するさまざまなメカニズムがあります。たとえば、WSL(Linux用のWindowsサブシステム)はWin32上では動作せず、影響を受けません。何をしているのかを知っているプログラムのために \\?\ bypassメソッド、 意図的な「バックドア」が残されています。 C:\Example\....\を作成することはできませんが、だけで\\?\C:\Example\....\を作成することができます。

同様に、Cmdからrmdir \\?\C:\path\...を使ってそのようなディレクトリを削除することもできます(私はまだPowerShellでテストしていません)。

さまざまなファイルマネージャ、アーカイバなどが、通常より長いパス名を使用できるようにするために\\?\メソッドを使用する場合があります。そうすることで、Win32内の互換性コードの影響も受けません。ドットストリッピングや、CONNULのような魔法のファイル名の翻訳を回避します。

それでそれはあなたのプログラムのうちの1つであるかもしれません:

  1. ファイルへのアクセスには常に\\?\を使います。
  2. 誤って....という名前のフォルダを作成しようとしました - しかし、事後に確実に知ることは不可能です。
303
grawity

@ grawityの答えに加えて、Win32プログラムは「ネイティブ」APIを直接呼び出すことによってこれを行うこともできます。私が間違っていなければ、この場合はNtCreateDirectoryObjectになります。これらの呼び出し、特にカーネル対応物(Win32プログラムからは呼び出せません)、この場合はZwCreateDirectoryObjectは、かなりよく文書化されています。

「無限の深さ」に関して、これを達成する簡単な方法はリンクを使用することです。ディレクトリを作成し、次にその中にジャンクションを作成します(たとえばmklink /jを使用できます)。そして、非常に深い構造になります。私が前回これをしたのはWindows 2000でしたが、再帰の終わりがありました(あなたは「無限に掘る」ことはできませんでした)。おそらく新しいOSでは、制限がもっと大きくなるか削除されます。10個のディレクトリをそれぞれ前のディレクトリの子にし、10番目のディレクトリに最初のディレクトリへのリンクを作成することもできます。

22
user1532080

ディレクトリを作成するより簡単な方法があります。コマンドプロンプトから:

MD ....\

enterキーを押すと、4つのドットを持つディレクトリが作成されます。このディレクトリはエクスプローラでも見ることができます。

MS-DOSにはバージョン1.0に戻る問題があります。 MSはしばらくそれについて知っていましたが、それを修正することができなかったか、またはしないでしょう。彼らはPowerShellの問題を修正しました。

ところで、試してみた場合:

RD ....

削除に失敗します。削除するには、この特定の構文を使用する必要があります。

RD ....\

私が管理している特定のサーバーでこれを使用します。私はディスクのルートにユーザーフォルダを作成することがよくありますが、他の管理者が一緒になって削除したくない場合があります。

だから私は自分のフォルダの中に入り、CON、AUX、またはLPTなどという名前のサブフォルダを作成します。

他の管理者が自分のフォルダを削除したい場合は、まずこのサブフォルダを削除する方法を知っておく必要があります。

編集:私は今朝この議論について考えていた、そして私はこれをさらに一歩進めることにした。これが適切かどうかは、modが判断すると思います。

CDをフォルダに入れることができません。

私がc:\ testとCD C:\ testそしてMDをMDとした場合、考えてみてください。

そしてすべてが順調です。

しかし、CD ....は失敗し、C:\ testに戻ります。 (CD .... \も同じです。)

しかし、私はDIRをすることができます....そして、dirのリストを取得します。私がすることもできます

MD C:\ test ....\tempそして....その中にサブディレクトリを作成します。

CD C:\ test ....\tempを使ってそのサブサブディレクトリに移動することもできます。

しかし、C:\ test ....\tempにいる間は、CDなら.. C:\ testに戻ります。

そのディレクトリにcdすることはできませんが、サブフォルダを作成することでフォルダを操作することができます。

ECHO "テスト" >> C:\ test ....\test.txt

また、そのフォルダ内にファイルを作成して作成します。だから私は4つの点でフォルダを作成することができます、私はそれにファイルやフォルダを追加することができます、私はそれの直接のリストを得ることができますが、私はそれにCDを入れることはできません。これにはある種の悪の天才的な用途があるのでしょうか。私があまりにも遠く離れてコースを離れているならば、改造者たちへの私の謝罪。

17
Larryc