rmdir /s でしか削除できない奇妙な空のディレクトリ

rmdir /s でしか削除できない奇妙な空のディレクトリ

どういうわけか、通常の では削除できない空のディレクトリ (数か月前に NodeJS で実行したスクリプトの一部として作成) ができてしまいましたrmdir。 ディレクトリを好きなだけコピー アンド ペーストできますが、 を使用するとコピーも削除できないまま残りますrmdir

C:\testing>dir
 Volume in drive C is Local Disk
 Volume Serial Number is 8830-C25A

 Directory of C:\testing

20/07/2020  04:47 PM    <DIR>          .
20/07/2020  04:47 PM    <DIR>          ..
20/07/2020  01:25 PM    <DIR>          test
               0 File(s)              0 bytes
               3 Dir(s)  43,126,059,008 bytes free

C:\testing>rmdir test
Access is denied.

これは管理者のコマンドプロンプトで実行され、ディレクトリのすべての権限を次のように設定しましたFull control

ここに画像の説明を入力してください

あらゆる兆候から判断すると、ディレクトリは完全に空です。エクスプローラーで隠しファイルとシステム ファイルをオンにしましたが、サブディレクトリやファイルは表示されず、dir /a何も表示されません。

C:\testing\test>dir /a
 Volume in drive C is Local Disk
 Volume Serial Number is 8830-C25A

 Directory of C:\testing\test

20/07/2020  01:25 PM    <DIR>          .
20/07/2020  01:25 PM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  43,123,294,208 bytes free

attribdir で実行しても何も表示されません。

C:\testing\test>attrib
File not found - C:\testing\test\*.*

もう一つの奇妙な点は、 ではなくAccess is deniedを試みたときに通知されることです。rmdirThe directory is not empty

また、何らかのプログラムがディレクトリのオープン ハンドルを持っている可能性も考えました (元のファイルからコピーして貼り付けたので、その可能性は低いですが)。考えられるすべての方法 (LockHunter、Process Explorer のハンドル検索、Resource Monitor のハンドル検索、Sysinternals のハンドル プログラム) で確認したところ、どこにもオープン ハンドルが見つかりませんでした。

この時点で何かが起こっているように見えますよね?それでは本当に奇妙なことに、rmdir /s test(再帰削除)を実行すると、問題なく削除されます。

C:\testing>rmdir /s test
test, Are you sure (Y/N)? y

C:\testing>dir
 Volume in drive C is Local Disk
 Volume Serial Number is 8830-C25A

 Directory of C:\testing

20/07/2020  04:58 PM    <DIR>          .
20/07/2020  04:58 PM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  43,120,893,952 bytes free

これは、実際に内部に何かがあることを意味します。それは何でしょうか? これまで行ったことのどれも役に立つことは何も示していないので、本当に興味があります。この特定のディレクトリ (またはそのコピー) で失敗のtest原因が何なのか、まったくわかりません。rmdir test

それで、私の正式な質問は、この奇妙な行動の原因は何ですか?

答え1

コメント欄の @LPChip さんの素晴らしい仕事のおかげで、私は今、答えを見つけたと思います。

attribフォルダー自体に対して を実行すると( attrib test)、フォルダーに読み取り専用属性があることが判明しました。

C:\testing>attrib test
     R               C:\testing\test

読み取り専用属性を削除すると、フォルダーを削除できるようになります。

C:\testing>attrib -r test

C:\testing>rmdir test

C:\testing>dir
 Volume in drive C is Local Disk
 Volume Serial Number is 8830-C25A

 Directory of C:\testing

23/07/2020  09:03 AM    <DIR>          .
23/07/2020  09:03 AM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  43,965,960,192 bytes free

新しいフォルダーを作成し、読み取り専用属性を追加すると、問題が正確に再現されます。

C:\testing>md test2

C:\testing>attrib +r test2

C:\testing>rmdir test2
Access is denied.

これがrmdirフォルダーの削除を妨げている原因ですが、2 つの疑問が残ります。1) はrmdir /s機能するのに、なぜrmdirは機能しないのか、2) プロパティ ダイアログで読み取り専用チェックボックスを変更しても明らかな効果がないのはなぜでしょうか。

さらに調べてみると学んだWindowsのフォルダのプロパティダイアログでは、フォルダ自体の読み取り専用属性を設定することはできず、その内容のみ設定できる。私は以前、テキスト「フォルダ内のファイルにのみ適用されます」つまり、「混合」状態の設定はコンテンツにのみ適用されますが、「オン」はすべてに適用されます (そこまで考えていませんでした)。ただし、実際には、「オン」または「オフ」のいずれかの状態に設定すると、選択した状態がコンテンツにのみ適用され、「混合」状態は単に「すべてをそのままにする」ことを意味します。

ここに画像の説明を入力してください

これは、プロパティ ダイアログで見られた混乱した動作を説明していますが、rmdirsays Access is deniedbutrmdir /sが機能する理由については説明していません。 うーん...わかりません。これは、下位互換性の問題、Unix 互換性の問題、バグ、意図的な設計上の決定 ( を使用すると、/s「よろしいですか?」というプロンプトが表示される) の可能性があります。この動作に関する参照を見つけることができません。詳しい情報をお持ちの方がいらっしゃいましたら、お知らせください。回答に追加します。

関連情報