- ベストアンサー
フォルダの検索とファイルの存在チェックの方法について
- フォルダの検索とファイルの存在チェックの方法について説明します。
- _rmdirコマンドを実行してもディレクトリが消えない問題について、解決方法をご紹介します。
- ソースコードの中でフォルダの存在を確認する方法やファイルのチェック方法を説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#2 のお礼に関してです。 要するに,ディレクトリの削除に先立って, ディレクトリ内のファイルを列挙し,ファイルを削除しているのですね? そのファイルを列挙する際に,ディレクトリが開きっぱなしになっているのではありませんか? どのようにファイルを列挙しているのか分かりませんが, 例えば,FindFirstFile で得たハンドルを閉じていないとか。 それから,ファイルを列挙する際に,ディレクトリがカレントディレクトリになっていないかどうかも, きちんと確認しておいたほうがいいと思います。 # ディレクトリごと削除ならこんな方法も。 # http://www.okweb.ne.jp/kotaeru.php3?q=735562
その他の回答 (2)
私のところでは, 以下のようなコードで問題なくディレクトリが削除できているのですが, そちらではどうでしょうか? 環境 : Windows 2000 SP4, VC++ 6.0 SP5 int main(int argc, char* argv[]) { const char *dirName = "c:\\temp\\newDir"; // c:\temp は既存のディレクトリ _mkdir(dirName); getchar(); // ここで newDir が作成されていることを確認 FolderSearch(dirName); // IsExistFile(dirName); _rmdir(dirName); return 0; } しつこいようでうが, _rmdir でディレクトリ削除できないプログラムで, FolderSearch または IsExistFile の呼び出しのみをコメントアウトし, 他は全く同じ条件で動かせば,削除できるのですね? それと,マルチスレッドになってたりします?
お礼
ありがとうございます。本当にありがとうございます。 環境はほぼ同じです。これに問題があるとは思えません。 マルチスレッド・・・はちょっとよくわかりません。まだ初心者の域なので、 そんなに凝ったプログラムではないです。 でも、だんだんわかってきました・・・(2日なにやってんだろう) フォルダの中身をまず、全部消してから、その後に ディレクトリそのものを削除しようとしているのですが、 このままだとアプリケーション自身が実行を終えるまで 「ディレクトリ削除」はできないもようです。 というのも、ファイルを消し終わってからアプリケーションがまだ 終了しない段階で、エクスプローラーで直接ディレクトリを削除 しようとすると、 「 ~ フォルダが削除できません。共有違反がありました。 送り側受け側のファイルは使用中の可能性があります。」 とアラートが出ます。 ちなみに、本アプリでファイルを削除しない場合、つまり ハナから空のディレクトリは無事 _rmdir で消すことができます。 やはり ファイルを削除した後、システム的にディレクトリを 掴みっぱなしになってるようです。 もし、これの回避の仕方がわかればでけっこうですので、 また教えていただければ幸いです。
環境は VC と思っていいのでしょうか? MSDN に 「_rmdir 関数は、dirname で指定したディレクトリを削除します。 削除できるディレクトリは空のディレクトリだけです。 カレント ディレクトリやルート ディレクトリは削除できません。」 とありますがそのあたりは大丈夫なのでしょうか? 「以下のソースのあとに」でなければ, _rmdir でディレクトリを削除できるのでしょうか? # ファイルがあるかどうかは,GetFileAttributes でも調べられます。
お礼
ありがとうございます。 もちろんディレクトリにファイルは空の状態でおこなっています。環境はVCです。
補足
すみません、つけたしです。以下のファイルのあとでなければ、削除できてるんです。確かに。 カレントディレクトリの件ですが、2者ともできないので、ディレクトリ移動の問題ではないと踏んでいます。 ですから、ハンドルかなにかで、ディレクトリを 掴みぱっなしになっているのかも、とおもってるんですが、その解消法(離し方)等がわかりません。
お礼
大変遅くなってしまいましたが、再度のご回答ありがとうございます。 なかなか時間がなくてまだ確認できていませんが、 いただいたアドバイスをもとにじっくり原因をさぐってみたいと思います。