だが、ちょっと気持ち悪いAPIのせいで気持ち悪い現象に嵌った。
Tomcatからの操作でディレクトリをFiles.delete(path)で消すと、成功する。成功するのにディレクトリは消えていない。もう一度消すと失敗する。そりゃそうだ、さっき削除に成功しているのだから。
でも、ディレクトリは依然として存在している・・・なぜかタイムスタンプがなくなった状態で。
そして、Tomcatをシャットダウンするとディレクトリは消える。
・・・という現象。
何かをcloseし忘れてるのだろうとは思ったが、ファイルじゃなくてディレクトリだし、空だし・・・と悩んでしまった。
結局、Files.listで一覧を取得した際に帰ってくるStreamをcloseしていなかったから、ファイルのハンドルが閉じていなかったようだ。で、プロセスが消える時にそれが閉じるのでようやく本当に消えると。
でもさあ。
Files.list(path).filter(f->Files.isDirectory(f)).forEach(f->Files.delete(f));// これはダメ
とか書きたくなるじゃん。Streamで帰ってくるんだから。
JavaDocをよく見たら、
try(Stream<Path> = Files.list(path)){
//do something
}catch(Exception e){
}
みたいにやれと書いてあったけど、なんかそんなら無理にStreamとかにしなくても良かったんじゃねえの、という気がする・・・。
なお、問題が起きてたのはWindows環境。Linuxだとどうなのかは確認してない。
0 件のコメント:
コメントを投稿