- PR -

JavaからのOSコマンド実行:ファイルのコピー後それらのファイルをzipできない。

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2006-01-24 19:49
いつも大変お世話になっております。

JSPで、あるディレクトリ内のファイル一覧を表示させ、
そこでユーザによりチェックを入れられたファイル名をServletが受け取ります。
そのServletでは
受け取った全てのファイルをあるディレクトリにコピーし、
その後、同ディレクトリ内にある全てのファイルをzip化します。

ところが、すべてのファイルが確かに規定のディレクトリにコピーされ
zipファイルが出来ているものの、zipファイルの中身が空っぽです。

当該プログラム終了後に同じzipコマンドでzip化してみると
正しく全てのファイルがzipされています。

何が悪いのかよろしければアドバイスをお願いいたします。

==============================================================
JSP 抜粋
--------------------------------------------------------------
<table cellpadding="4" cellspacing="0" border="1" bordercolor="#333333">
<tr>
<th>チェック</th>
<th>ファイル名</th>
<th>サイズ(KB)</th>
<th>最終更新日</th>
</tr>

<% File objFld = new File("/Outputs/");
File[] aryFls = objFld.listFiles();

for ( int i = 0 ; i < aryFls.length ; i ++ ) {
if ( ! aryFls[i].isDirectory() ) {
%>

<tr>
<td><INPUT TYPE="checkbox" NAME="file_list" VALUE="<%= aryFls[i].getName() %>"></td>
<td><%= aryFls[i].getName() %></td>
<td align="right">
<% out.print(Math.ceil(aryFls[i].length()/1024+1) + "KB"); %>
</td>
<td><%= (new Date(aryFls[i].lastModified())).toString() %></td>
</tr>

<%
}
}
%>

</table>

==============================================================
Servlet 抜粋
--------------------------------------------------------------
public void doGet ( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {

try{
byte buffer[] = new byte[4096];
String[] fileNames_ = request.getParameterValues("file_list");
Runtime process = Runtime.getRuntime();

for ( int i = 0 ; i < fileNames_.length ; i ++ ) {
process.exec("cp -f " + OUTPUT_PATH + new String(fileNames_[i].getBytes("ISO-8859-1"), "JISAutoDetect") + " " + ZIP_TEMP_PATH );
}

process.exec("zip " + ZIP_TEMP_PATH + ZIP_FILE_NAME + ".zip" + " " + ZIP_TEMP_PATH + " *.csv");

(続く)
==============================================================
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-01-24 23:56
引用:

未記入さんの書き込み (2006-01-24 19:49) より:

当該プログラム終了後に同じzipコマンドでzip化してみると
正しく全てのファイルがzipされています。


「同じzipコマンドで」とあるが、本当に同じなんだろうね。
99.9%の質問者はこれで片が付く。

もし同じだってんなら、サーブレットからの実行時に、
絶対パスでなく、相対パスで実行しようとしていることが考えられる。
コマンドラインから実行するときは利用できる相対パスが、
サーブレットから実行する場合は、カレントディレクトリが変わってしまっていて、
上記の相対パスでは、ファイルが見えないというわけだ。

こちらとしては、絶対パスでの実行をお勧めする。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-01-25 00:11
引用:

未記入さんの書き込み (2006-01-24 19:49) より:

何が悪いのかよろしければアドバイスをお願いいたします。


それと、Runtime#exec(String)は、Processインスタンスを返す。
Process#getOutputStream()を使えば通常はターミナルに出力されるメッセージが取得できる。
そうすれば、何が起こっているのかは把握できるでしょ。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2006-01-25 00:12 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-25 04:26
サーブレット上で実行するとパス解決をどうするか、カレントディレクトリはどこか、とか考える要素が多くなりますのでまずスタンドアロンで試してみてはいかがでしょう。

また、Runtime.exec() で呼び出さなくても Java の中で zip ファイルを作成する方法もあります。
Runtime.exe() の方が手っ取り早いかもしれませんが、ポータブルな実現方法ではありません。
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2006-01-25 10:56
お世話になっております。

最初の質問の記述に一つ訂正があります。
空のZIPが出来ると書いていましたが、現状ではそもそもZIPファイルができません。
(申し訳ございません。)

ところで、サーブレットにはデバッグのため次のようなコードを入れています。

(1) サーブレットからOSコマンド cp を利用してすべてのファイルをコピーし終わった後、
コピー先ディレクトリ内にあるファイルをログに一覧表示させる。
(2) OSコマンド zip を実行直後にその標準出力をログに書き出す。

(1)の結果は正しくコピーが済んでいることを示しているようでした。
ログファイルには確かに指定したファイルが表示されており
その時点でコピー先ディレクトリにファイルが存在していることを示しています。

(2)の結果は何もありませんでした。
標準出力に何も示されていないのでzipコマンド自体が効いていないのではないかと思いました。
ただし、そのログには文字列で実行しているコマンドも記載させていますが
そのコマンドをプログラム終了後にTerminalから直接実行すると期待通りZIPファイルが作成されファイルが圧縮されています。

さらに確認を進めますが、現状をご報告させていただきました。
もしアドバイスがありましたら何卒宜しくお願い申し上げます。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-25 11:44
サーブレット上で実行するとパス解決をどうするか、カレントディレクトリはどこか、とか考える要素が多くなりますのでまずスタンドアロンで試してみてはいかがでしょう。

また、Runtime.exec() で呼び出さなくても Java の中で zip ファイルを作成する方法もあります。
Runtime.exe() の方が手っ取り早いかもしれませんが、ポータブルな実現方法ではありません。
1

スキルアップ/キャリアアップ(JOB@IT)