filesystems – 私のWindowsマシン上で、私は4つのドットの名前を持つフォルダを持っていたが、それはある種のウサギの穴のように動作します – それはどのようにして起こったのですか?

filesystems windows

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

開こうとすると、全く同じフォルダを何度も何度も開くという、ある種の終わりのないウサギの穴のようなループに入ってしまいました。C:\ExamplePath\....\....\....\....\.... などのようなパスを表示する

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

フォルダ名が特殊なので普通の方法では削除できませんでした。結局、コマンドラインでrd /s /q pathで親フォルダを削除すれば削除できました

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

20年以上Windowsを使っている私にとって、このバグを見たことはありませんでしたので、素人のユーザーにとっては本当に迷惑で混乱を招く問題であることは想像できます

誰かこの問題の原因と再現方法を知っている人はいますか?

Update

興味のある人のために:このパスはTFSフォルダの奥深くにありました。なので、おそらくTFSは@grawityが説明したバイパス方法(「各種ファイルマネージャ、アーカイバなど」)を使っているのでしょう

珍しいTFSのバグでつまずいたかな?

  196  Dirk Boer  2018-10-31


ベストアンサー

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

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

しかし、NT カーネルはそのような名前を許可しています。Win32 API によって課せられたファイル名の制限を回避する様々なメカニズムがあります – 例えば、WSL (Windows Subsystem for Linux) は Win32 の上では実行されず、その影響を受けません。また、\\?\ バイパス方法もあります。これは、何をしているか知っているプログラムのために意図的に残された「バックドア」です。C:\Example\....\ は作れなくても、\\?\C:\Example\....\ は作れます

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

様々なファイルマネージャやアーカイバなどは、通常よりも長いパス名を使えるようにするために \\?\ メソッドを使用するかもしれません

あなたのプログラムの一つかもしれませんね

  1. は常に\\?\を使ってファイルにアクセスします
  2. 誤って .... という名前のフォルダを作成しようとしてしまった – しかし、実際には後になってから知ることはできません

303  user1686  2018-10-31


grawityさんの回答に加えて、Win32プログラムでも “ネイティブ “APIを直接呼び出すことでこのようなことができます。私の記憶違いでなければ、今回の場合は NtCreateDirectoryObject です。これらの呼び出しは最近ではかなりよくドキュメント化されていて、特にカーネルの場合は (Win32 プログラムからは呼び出すことができませんが) ZwCreateDirectoryObject

無限の深さ」についてですが、これを実現する簡単な方法はリンクを使うことです。ディレクトリを作成して、その中に、そのディレクトリへの分岐点を作成する(例えば、mklink /jを使うことができます)と、非常に深い構造になります。前回これをやったのは Windows 2000 で、再帰には終わりがありましたが(「無限に掘る」ことはできませんでした)、それより新しい OS では、再帰の限界があるかもしれません。また、新しいOSでは制限が大きくなっているかもしれませんし、10個のディレクトリを作成して、それぞれが前のディレクトリの子になっていて、10個目のディレクトリでは最初のディレクトリに戻るリンクを作成することもできます

21  user1532080  2018-10-31


ディレクトリを作成する簡単な方法があります。コマンドプロンプトから次のように入力します

MD ....\

と入力してエンターキーを押すと、4つの点で囲まれたディレクトリが作成されます。このディレクトリはエクスプローラーでも表示可能です

MS-DOSには、バージョン1.0までさかのぼる欠陥があります。MS は以前からこのことを知っていましたが、それを修正することができませんでしたし、修正しようともしませんでした。彼らは PowerShell で問題を修正しました

BTW、やってみたら

RD ....

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

RD ....\

私はこれを私が管理している特定のサーバーで使用しています。私はしばしばディスクのルートにユーザーフォルダを作成しますが、他の管理者が来てそれを削除したくないので、これを使用しています

そこで、私のフォルダの中にCON、AUX、LPTなどの名前のサブフォルダを作成します

他の管理者が私のフォルダを削除したい場合、彼らは最初にこのサブフォルダを削除する方法を知る必要があります

EDIT: 今朝、この議論について考えていたので、もう一歩踏み込んでみることにしました。私は、これが関連しているかどうかをmodsが決定することを前提としています

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

Consider, if I MD c:test then CD C:\test and MD …. I end up with C:\test

そして万事順調です

でも、CD …. は失敗して、C:\test に戻ってしまう。(CD ….も同様)

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

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

C:test0….\tempをCDにして、そのサブディレクトリに入ることもできます

But while in C:\test….\temp , if I CD … I am back in C:\test

私はそのディレクトリに cd することはできませんが、私はサブフォルダを作成することによって、フォルダを操作することができます、そして十分に興味深い何かのような

ECHO “Testing” >> C:\test….\test.txt

も動作し、そのフォルダにファイルを作成します。つまり、4つのドットでフォルダを作り、そこにファイルやフォルダを追加したり、そのフォルダのディレクトリリストを取得したりすることはできるのですが、そこにCDを入れることはできません。何か悪の天才的な使い方があるのでしょうか?私はあまりにもコースを逸脱している場合は、改造者に謝罪します

18  Larryc  2018-11-02


私も同じ問題を抱えていました。私の場合は、.NET Core publishのコマンドの打ち間違いでした

dotnet publish "Api.csproj" --output "....\output\"

….」という名前のディレクトリを作成しましたが、これを削除したり、名前を変更したりすることはできませんでした。このディレクトリは、親ディレクトリへの参照のように動作しました。そのフォルダの中に入っても、親フォルダのままだが、パスは「….\」で追加されていた

私はこのトピックで言及されているコマンドをすべて試してみましたが、それらのどれもが動作しませんでした。私の理解では、親ディレクトリに他のファイルやディレクトリを持っていたので、私は再帰的にすべてのコンテンツを削除することができますパラメータを使用しなければならなかったので、それは、そのように動作しました

私はこのコマンドを知りました

rmdir /s /q ....\

は ‘….’ ディレクトリを削除することができます。これは親ディレクトリへの参照を削除するだけで、この ‘….’ ディレクトリは実際にはそれ以上でもそれ以下でもありません。コマンドの引数にもかかわらず

  • /s – 削除されたディレクトリ内のすべてのコンテンツを削除します
  • /q – 確認なしで削除します

親ディレクトリには手を加えずに残っていました

-1  Mateusz  2019-06-04


タイトルとURLをコピーしました