FileUtils.rm_r が permission denied で削除完了できない(解決)
#解決したので下に追記。
考えてみるとたぶんこれは三度目のことだったのではないかと。tempfile ライブラリを使おうとしたのは。それしか使ったことがないのか、ともいえるし、必要がなかったのだともいえるかもしれないけれど。
生成ファイルを temp において、最後にそこからコピーしてきてから temp は削除といきたいのだけれど、時として permission denied エラーになって削除できずに終わってしまう。
ファイル数は全部で 100 くらいを扱っている例で今はみられているのだけれど、ほぼ全部くらいのときもあるし、ふたつくらいを残してほかは削除しました(がんばったよ)というときも。このあたりは、FileUtils.rm_rf() を使ってみて多少改善した感じ。
しかし、temp が残ってしまうのはよろしくない。カレントにあるならすぐわかるから最悪手動で削除というのもあるけれど、temp では気づかないうちにフォルダが膨れ上がってしまうこともありうるわけで。
ではと、カレントに作るようにしてエラーを発生させると、やはり同様にいくつかはどうしても残ってしまう。
これはバッファの問題なのだろうか?
ということで、IO#sync = true を使ってみることに。ファイルオブジェクトに設定してみたのだけれど、やはり結果は同じ。
今のところ生成しているファイルそのものにエラーが生じることはないので、まずそういう問題はないのだけれど、やはりきちんと削除できないと不便だ。やむなくまたカレントに作成するようにしてしまったけれど、できれば temp を使いたいところかなあと。
Ubuntu ではそういうことはないのだろうか? Windows 特有のことなのか、はたまた自分の環境特有? ということで、あとで Ubuntu でも試してはみよう。
追記:03/28
いろいろしているうちにようやく気づいたのは、明示的にファイルをクローズしてないことだった。ブロックで使っていないために最後にクローズすべきだった。それできちんと削除されるようになった。
なんとも恥ずかしい結末。
ただ、Ubuntu で実行したらまったく問題なく削除してしまったので、それはそれでどうなのかと思ってしまったりも。まあ、どちらがよいのかはわからないのだけれど。
いずれにしても開いたら閉じるという基本を怠ってはいけないということだなと。
| 固定リンク
コメント
伝統的な UNIX 系の OS だと普通、開いてるファイルも削除出来ますね。
それを利用して安全なテンポラリファイルとして利用するイディオムがあるぐらいには普通。
open() して unlink() すると他のプロセスからは絶対にアクセス出来ないファイルになるっていう。
投稿: | 2012.03.28 20:01
なるほど。そういうものなのですね。
テンポラリファイルということで考えれば、開きっぱなしで終わってしまったものも削除できなくては困るというのは、確かにありますね。
なるほどです。
投稿: ムムリク | 2012.03.29 11:50