質問: ### 環境等の前提情報 ・対象OS : Windows Server 2008R2 ・システム : batファイル 上記OSのフォルダ・ファイルに対し、 bat内のrmdir /s /qコマンドで削除する処理を行っている。 batは一日に複数回起動し、既に削除が成功している実績がある。 ### 発生している問題・エラーメッセージ 稀に上記batファイルでフォルダおよびファイル削除が 出来ない事象が発生する。 そのため削除に失敗した際にエラーの原因を特定できるよう 標準エラー出力をログに取得できるようリダイレクト処理を追加した。 リダイレクト処理追加後に削除失敗の事象が再発したので エラーログの確認をしたところ以下のエラー出力がリダイレクトされていた。 ``` ディレクトリが空ではありません。 ``` ### わかっていること まず「ディレクトリが空ではありません。」というメッセージは rmdirコマンドに/sオプションを追加しないと発生するメッセージであること。 しかし、今回はrmdir /s /qコマンドを実行したにもかかわらず 上記メッセージが出力されたこと。 ### 知りたいこと ・rmdir /s /qコマンドを実行しても「ディレクトリが空ではありません。」 のメッセージが出る原因・理由について。 ・どうすれば再発を防止できるか。 ### 補足情報(言語/FW/ツール等のバージョンなど) 特になし。
回答: `rmdir /s /q` で指定のフォルダー(ディレクトリ)下を削除するときに、別のアプリケーションがそのフォルダー下でなんらかのファイル操作をしているのではないでしょうか。 BATファイルは一日に複数回起動しているということで、何かしらのスケジューラーを利用されていると推察しますが、対象のフォルダーは様々なアプリケーションが使用するフォルダーと言うことは無いですか。それらのアプリケーションがファイルを開くタイミングによっては、同様のエラーは起こりえます。 実際にテストプログラムを作成して試しました。下図は、テストプログラムで D:\project\teratail\96390\testdir\sub1\sub2\*.* のファイル一覧の取得中に rmdir /q /s でD:\project\teratail\96390\testdirを削除しようとしているものです。大したプログラムではないのでソースの掲載は省きます。 !イメージ説明 「ディレクトリが空ではありません」とエラー表示されます。テストプログラム自身がディレクトリ/ファイル一覧を取得する為にそれ用のハンドルを開いている為です。尚、タイミングによってはエラーは「アクセスが拒否されました。」となります。 再発の防止策としては、「対象のフォルダー下が確実にアクセスされない時間を選ぶ」か、エラーが起きたら再度、rmdir で削除することで代替策とするしか無いと考えます。 もし、「エラーが起きたときにアプリケーションがそのフォルダーにアクセスしていたか。」を調べたいのであれば、例えば以下のようなツールを使ってそのフォルダーやファイルにアクセスしているアプリケーションがないか検証してみる必要があります。が、やり過ぎ感がありますし、リアルタイムに捉えるのは困難です。 Windows Sysinternal - Process Monitor エラーはファイルシステムに影響するものですので、質問者様とは状況が異なる可能性はありますが、少なくともそのようなケースはあり得るということで回答させていただきました。当方ではWindows7 Ultimate 64ビット版 で、NTFSでフォーマットしたD:ドライブで試しました。