dポイントプレゼントキャンペーン実施中!

Runtime.exec()について質問させて下さい。
現在、Windowsのサーブレット上のファイル操作で
ファイルの属性ごと(読み取り専用)コピーしたいので
Runtime.exec()からxcopyコマンドを呼び出してコピーしています。
(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)

エディタはeclipse3.5を使用しております。
eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、
Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー)
eclipse3.5上のTomcat設定とTomcat自体のJVM設定でのJREパスは同じJRE
を参照しています。常にEclipseを起動させた状態!!ってのは厳しいので
なんとかTomcatのみでコピーを成功させたいので助言お願いいたします。

下記ソースで 4個の読み取り属性を強制上書きコピーしますと、表示は
Eclipse3.5上では → 「4個のファイルコピーに成功」表示
Tomcat6上では   → 「0個のファイルコピーに成功」表示
となります。。。


【以下ソース】

CopyFrom = "コピー元パス";
CopyTo  = "コピー先パス";

try{
 String[] cmd = new String[]{"cmd","/c","xcopy",CopyFrom+"*.*",CopyTo,"/y","/r","/k","/h"};
 Runtime Run = Runtime.getRuntime();
 Process process = Run.exec(cmd);

 //実行結果取得
 InputStream is = process.getInputStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 String Line = null;
 while((Line = br.readLine()) != null){
  System.out.println(Line);
 }
}catch(IOException e){
 System.out.println(e);
}

【環境】
・Windows Server2003
・Java1.6.0_13(パスは通しています)
・Tomcat6.0.14

A 回答 (1件)

「0個のファイルコピーに成功」というメッセージが出るのなら、Tomcat上で実行したときにはコピー元のファイルが無い(見えない)のでしょうね。



動作が変わってしまう原因は、例えばカレントディレクトリや環境変数、実行ユーザの違いが考えられると思います。xcopyの代わりにdirを実行してみるなどすると、何か分かるのではないでしょうか。

それで、「(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)」と書かれていましたが、Java 6では java.io.File クラスにメソッドが追加されており、基本的な属性の変更は可能です。

「Java SE 6完全攻略」第36回 パーティションの容量とファイルの属性
http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …

に解説があります。勿論、xcopyの方が便利なこともあると思います。

また、上の記事でも使われていますが、java.lang.Runtime#exec() を使うよりも、java.lang.ProcessBuilder クラスを使うほうが少し簡単に書けて便利だと思います。ProcessBuilderクラスは

外部アプリ起動がプチ簡単に ProcessBuilder
http://www.javainthebox.net/laboratory/J2SE1.5/T …

で紹介されています。
    • good
    • 0
この回答へのお礼

kenichiice様

回答ありがとうございます。
kenichiice様のご指摘どおり、Windowsのサービスとして起動している
Tomcatのログオンユーザーを「ローカルシステムアカウント」から
「コンピュータのAdminユーザー」に変更することで見事コピーできました。(内向きネットワークなのでAdminでもセキュリティ上問題無し)

Tomcatサービスに実行権限があったとは・・・。
ひとつ勉強になりました。ありがとうございました。m(_ _)m

お礼日時:2010/04/08 08:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!