2016-12-30 12 views
0

とジッパーで再帰的なディレクトリ構造を保存します、私はそれを(unzip assets.zipを介して)解凍すると、assetsフォルダの下のディレクトリ構造を保持します。したがって、解凍すると、ZIPの "ルート"にはconfig.yml、ZIPには2つのディレクトリ(modelsおよびtextures)が表示されます。は、私は私のラップトップ上の次のディレクトリを持っているJavaの8

File sourceDir = new File("/tmp/myapp/assets"); 
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 

File[] contents = sourceDir.listFiles(); 
for(File file : contents) { 
    zip.putNextEntry(new ZipEntry(file.name)); 
    InputStream isteam = new FileInputStream(file); 

    Files.copy(isteam, zip); 
    zip.closeEntry(); 
    isteam.close(); 
} 

zip.close(); 

コードが正しく/Users/myuser/archives/assets.zipでZIPを作成します。私はこのコードを実行すると、ファイルの残りの部分では、など

、これらのそれぞれのサブディレクトリ内になります。

私はそれ( unzip /Users/myuser/archives/assets.zip)解凍

しかし、その後、ls -al /Users/myuser/archivesを実行し、私の出力は次のようになります。

-rw-r--r-- 1 myuser 1754083733 492 Dec 30 14:14 assets.zip 
-rw-r--r-- 1 myuser 1754083733 10 Dec 30 14:14 config.yml 
-rw-r--r-- 1 myuser 1754083733 7 Dec 30 14:14 models 
-rw-r--r-- 1 myuser 1754083733 9 Dec 30 14:14 textures 

のでmodelstextures両方がファイル(いないディレクトリなど)のように扱われています。さらに、「modelsファイル」の内容を調べると、の内容がtroll.plytree.plyと連結されているように見えます。また、2つのPNGの「treeファイル」の場合も同様です。

結果のZIPにディレクトリ構造(深度/ネストに関係なく)が常に保持されるように、これを調整するにはどうすればよいですか?

+0

... – Holger

答えて

1

あなたはおそらく、サブディレクトリ構造を維持するために、再帰的なメソッド呼び出しを使用することができます。

private static void addDir(File sourceDir, ZipOutputStream zip) throws IOException { 
    File[] contents = sourceDir.listFiles(); 
    for(File file : contents) { 
     if(file.isDirectory()){ 
      addDir(file, zip); 
     } else { 
      zip.putNextEntry(new ZipEntry(file.getAbsolutePath().replace("/tmp/myapp/",""))); 
      System.out.println("file name " + file.getAbsolutePath().replace("/tmp/myapp/","")); 
      Path rn_demo = Paths.get(String.valueOf(file)); 
      Files.copy(rn_demo, zip); 
     } 
    } 
    zip.closeEntry(); 
} 

、あなたは以下のようにmainメソッドを呼ぶ:あなたのコードには再帰がありません

public static void main(String[] args) throws IOException { 
    File sourceDir = new File("/tmp/myapp/assets"); 
    ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 
    addDir(sourceDir, zip); 
    zip.close(); 
} 
+0

ありがとうございます@Sasi(+1)あなたのソリューション**は**実行時に動作するように見えますが、コマンドラインからZIPファイルを解凍すると、次のエラーが表示されます: 'Archive:assets.zip End-of -central-directoryの署名が見つかりません。このファイルはzipファイルではなく、マルチパートアーカイブの1つのディスクを構成します。後者の場合、中央ディレクトリとzipfileコメントはこのアーカイブの最後のディスクにあります。 unzip:assets.zipまたはassets.zip.zipのいずれかでzipfileディレクトリを見つけることができず、assets.zip.ZIP、period ...が見つかりません。 – smeeb

+0

どこでもZIPエントリを閉じることができませんでした( 'zip.closeEntry() ')、それは問題だろうか? – smeeb

+0

@smeeb:どうやってファイルを解凍していますか?私は何の問題もない。あなたのコマンドラインから "yourfilename"というファイルをタイプすることができますか?(これはOSXまたは* inuxシステムの場合にファイルのタイプを与えます) –

関連する問題