2012-01-11 10 views
1

次のコードを使用して、すべてのサブディレクトリとファイルを含むディレクトリを1つのjarファイルにパッケージ化しようとしています。ディレクトリ全体をjar/zipする方法java.util.jar APIを使用した構造?

private void writeFile(JarOutputStream jos, File f) throws IOException { 
    byte buffer[] = new byte[BUFFER_SIZE]; 

    if (f == null || !f.exists()) 
     return; // 

    JarEntry jarAdd = new JarEntry(f.getName()); 
    jarAdd.setTime(f.lastModified()); 
    jos.putNextEntry(jarAdd); 

    if(f.isDirectory()){ 
     File[] files = f.listFiles(); 
     for(int i = 0; i < files.length ; i++){ 
      writeFile(jos,files[i]); 
     } 
    } 
    else{ 
     FileInputStream in = new FileInputStream(f); 
     while (true) { 
     int nRead = in.read(buffer, 0, buffer.length); 
     if (nRead <= 0) 
      break; 
     jos.write(buffer, 0, nRead); 
     } 
     in.close(); 
    } 
} 

FileInputStreamはディレクトリでは機能しないため、JarEntryを追加すれば十分です。

私は別の問題があるので、この仮定が正しいかどうかはわかりません。 この問題は、作成されたエントリの多くが重複していることが原因です。

構造を追加しようと

...
activation 
/--activation 
    /-- somefile.txt 

...活性化がジャーに二度追加されるため、このコードは、失敗しました。 これらは互いに異なるディレクトリがネストされているので、なぜこの方法が何らかの形では機能しないのはわかりません。

file.getName()を使用してエントリを追加すると、それらのファイルがでているディレクトリを区別しませ ないエントリ-idを取得しますようです。 しかし、私は、例えば

file.getAbsolutePath() 

を使用する場合、 jar構造体が "C_"のような というディレクトリに混乱しており、含まれているファイルはもう読めません。

ディレクトリ構造をjarファイルに正しくパッケージ化する方法をお勧めしますか?

+0

私が作ったクラスを見てください:http://all-inhonmodman.svn.sourceforge.net/viewvc/all-inhonmodman/ModManager/src/modmanager/utility/ZIP.java?revision=292&content-type= text%2Fplain必要なすべての方法があります。 – SHiRKiT

答えて

4

ディレクトリ(フォルダ)を表すJarEntryは、そのまま扱うためにはスラッシュ( "/")で終わらなければなりません。そうでなければ、それはプレーンなファイルと見なされます。

JarEntry dir = new JarEntry("activation/"); 
3

エントリの名前は、ツリーのルートからの相対パスである必要があります。あなたは

a 
-- b 
------c.txt 

をお持ちの場合はエントリがa/a/b/a/b/c.txtでなければなりません。プレフィックス引数を再帰メソッド(最初は空の文字列)に追加し、ディレクトリが満たされるたびに、現在の接頭辞+ディレクトリ名に+ /を追加してメソッドを呼び出します。そして、ファイル名に接頭辞を常に付加して、エントリ名を構成します。

+0

どちらの回答も私の仕事を大きく助けましたが、私は1つしか受け入れることができません。だから両方に感謝! – elfwyn

関連する問題