2007-11-27
■[Java][Linux] java.io.File.renameTo()がパーティションを跨げない件
今日始めて知りました。誠に申し訳ない。
File.renameTo()は、Linux上ではrename()システムコールを使って実現されます。rename()システムコールは、ファイル実体はそのままで、ファイルのメタ情報のみを変更してrenameを実現します(故に高速)が、これができるのは同一パーティション上(同一ファイルシステム上)のみです。
ここまではまぁ、知ってみれば成る程合点が行くのですが、気に入らないのは、上記理由で失敗した時のJDKの挙動です。renameTo()の返り値はbooleanで、この場合はfalseが返るのですが、これだけではなぜ失敗したのかわかりません。ここはExceptionをスローすべきだと思うんですが。何か深い理由があるんでしょうか。
とりあえず、.NETのようにjava.io.File.moveTo()メソッドを実装してほしい。こういうところでは.NETの方が使い勝手がいいですね*1。
ちなみに、Exceptionがスローされるわけでもないのに、なぜかrenameTo()が失敗する、という状況で、どうやってここまでたどり着いたか、というと、伝家の宝刀straceです。件のJavaプログラムをstraceにかましてやり、straceログをファイル名で検索すると、rename()システムコールで-1が返っているのがわかります。あとは偉大なるgoogle先生に聞けばよろし。偉大なりstraceとgoogle先生。
トラックバック - http://d.hatena.ne.jp/igarashitm/20071127/1196182665
リンク元
- 8 http://www.google.com/search?client=safari&rls=ja-jp&q=Emacs+Leopard&ie=UTF-8&oe=UTF-8
- 7 http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla:ja-JP-mac:official&hs=yYy&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=leopard+bluetooth&spell=1
- 7 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GZEZ_jaJP239JP239&q=java+Runtime++exec+バックグラウンド
- 5 http://www.google.com/search?client=safari&rls=ja-jp&q=carbon+emacs+leopard&ie=UTF-8&oe=UTF-8
- 4 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:en-US:official&hs=u0j&q=thunderbird+leopard&btnG=検索&lr=
- 4 http://www.google.co.jp/search?q=carbon+emacs+leopard&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&client=firefox-a
- 3 http://apple.excite.co.jp/search.gw?look=applejp_jp&search=igarashitm
- 3 http://www.google.co.jp/search?hl=ja&q=renameTo+失敗&btnG=Google+検索&lr=
- 3 http://www.google.com/search?client=safari&rls=ja-jp&q=Leopard+emacs&ie=UTF-8&oe=UTF-8
- 3 http://www.google.com/search?client=safari&rls=ja-jp&q=leopard+bluetooth&ie=UTF-8&oe=UTF-8
