どういうわけか、通常の では削除できない空のディレクトリ (数か月前に 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
attrib
dir で実行しても何も表示されません。
C:\testing\test>attrib
File not found - C:\testing\test\*.*
もう一つの奇妙な点は、 ではなくAccess is denied
を試みたときに通知されることです。rmdir
The 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のフォルダのプロパティダイアログでは、フォルダ自体の読み取り専用属性を設定することはできず、その内容のみ設定できる。私は以前、テキスト「フォルダ内のファイルにのみ適用されます」つまり、「混合」状態の設定はコンテンツにのみ適用されますが、「オン」はすべてに適用されます (そこまで考えていませんでした)。ただし、実際には、「オン」または「オフ」のいずれかの状態に設定すると、選択した状態がコンテンツにのみ適用され、「混合」状態は単に「すべてをそのままにする」ことを意味します。
これは、プロパティ ダイアログで見られた混乱した動作を説明していますが、rmdir
says Access is denied
butrmdir /s
が機能する理由については説明していません。 うーん...わかりません。これは、下位互換性の問題、Unix 互換性の問題、バグ、意図的な設計上の決定 ( を使用すると、/s
「よろしいですか?」というプロンプトが表示される) の可能性があります。この動作に関する参照を見つけることができません。詳しい情報をお持ちの方がいらっしゃいましたら、お知らせください。回答に追加します。