Javaで、「現在ディレクトリ」(Current Working Directory)は変更出来るか?
→答え:「現在ディレクトリの変更」が、unixで言うところのchdir(2), WindowsAPIでのSetCurrentDirectory()を呼ぶ、という意味であれば、JDK 1.7現在でもJDKライブラリの世界だけでは出来ません。それらのAPIを叩くインターフェイスが用意されてないっぽい。
もちろんchdir(2)とかSetCurrentDirectory()を呼ぶJNIを作成して叩かせるとかすれば無理やり出来ると思いますが、そもそもJDKはそういう状況を想定していないため、アチコチで嵌りそうな気がします。
→ただし、「ファイル名解決に使う現在ディレクトリを変更する」という意味であれば回避策はあるようです。
Fileクラスのコンストラクタには、ファイル名解決に使う親ディレクトリの有無でバリエーションがあります。親ディレクトリが指定されていれば、そこを現在ディレクトリとして相対パスを解決します。指定されていない(むしろそちらのほうがよく使われる)コンストラクタでは、System.getProperty("user.dir")を使って相対パスを解決します。
つまり、Fileクラスのコンストラクタによるファイル名の解決においては、System.getProperty("user.dir")がデフォルトの「Current Working Directory」であり、「Current Working Directory」を変更したければ、単にFileクラスのコンストラクタでparentを指定するバージョンを使い、parentに自前で用意した「現在ディレクトリ」を指すFileオブジェクトを指定すればよい、という流れになります。
※System.setProperty("user.dir", ...)しちゃっても大丈夫かどうかはちょっと自信ないです・・・。
→もしも「外部プロセスを起動した時の現在ディレクトリを変更する」という意味であれば、ProcessBuilderを使うことで現在ディレクトリを明示的に指定して、外部プロセスを起動することが可能です。(多分、ProcessBuilderのdirectory()メソッドでイケる・・・筈・・・)
参考資料:
コメント