2016-04-26 7 views
0

ファイルとそのサブディレクトリを含むディレクトリを圧縮したかったのです。私はこれを行い、正常に動作しましたが、私は奇妙で興味深いファイル構造を取っています(少なくとも私はそのように見ています)。彼らはに示したとおり(すべてではない名前がexaclyあるenter image description hereが、私はこれを解凍するとき、私は、このファイル構造を参照してください。Empty zip file私はそれをクリックすると、私はこのような「空」のディレクトリを参照してください。Javaを使用してディレクトリを圧縮するときに異常な構造ファイルを取得する

これが作成されたファイルです下の画像):

|mantenimiento 
    |Carpeta_A 
    |File1.txt 
    |File2.txt 
    |Carpeta_B 
    |Sub_carpetaB 
     |SubfileB.txt 
    |Subfile1B.txt 
    |Subfile2B.txt 
    |File12.txt 

私の問題は、何らかの形で、私は)私はzip圧縮したいディレクトリ(からzipppingていると私はそれがそこになりたいいけないので、私は解凍したときにどこのフォルダ「mantenimiento」であるということですちょうど作成された.zipファイル私はこのファイル構造(これは "mantenimiento"ディレクトリ内のファイルとディレクトリです):Correct directory structureとそれ以外のものは、.zipファイルをクリックするとファイルを表示します。上記の画像とまったく同じです。

私のコードに何が間違っているのかわかりませんが、私は検索しましたが、私の問題が何であるかについての参考文献は見つかりませんでした。ここで

は私のコードです:

private void zipFiles(List<File> files, String directory) throws IOException 
{ 
    ZipOutputStream zos = null; 
    ZipEntry zipEntry = null; 
    FileInputStream fin = null; 
    FileOutputStream fos = null; 
    BufferedInputStream in = null; 

    String zipFileName = getZipFileName(); 

    try 
    { 
     fos = new FileOutputStream(File.separatorChar + zipFileName + EXTENSION); 

     zos = new ZipOutputStream(fos); 

     byte[] buf = new byte[1024]; 

     int len; 

     for(File file : files) 
     { 
      zipEntry = new ZipEntry(file.toString()); 
      fin = new FileInputStream(file); 
      in = new BufferedInputStream(fin); 
      zos.putNextEntry(zipEntry); 
      while ((len = in.read(buf)) >= 0) 
      { 
       zos.write(buf, 0, len); 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.err.println("No fue posible zipear los archivos"); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     in.close(); 
     zos.closeEntry(); 
     zos.close(); 
    } 

} 

はあなたたちが私に私が間違っているのか、私が行方不明です何かについてのヒントを与えることができることを望みます。

ありがとうございます。

Btw、私がこのメソッドに与えているディレクトリは決して使用されません。私が与えている他のパラメータは、C:\ mantenimientoディレクトリのすべてのファイルとディレクトリを含むファイルのリストです。

+0

getZipFileNameメソッドを共有できますか? – Sanj

+0

そのメソッドの実装は非常に簡単です:private String getZipFileName method() { \t String zipName; \t \t日付currentDate = newDate(); \t \t SimpleDateFormatフォーマッタ= SimpleDateFormat( "yyyy_MM_dd_HH-mm-ss"); \t \t zipName = formatter.format(currentDate); \t \t return zipName; \t } –

答えて

0

作成したzipにファイルのエントリのみが含まれているフォルダ(つまり、//Carpeta_Aなど)が含まれていないWindowsおよびzipファイルに問題が発生しました。コンテンツをストリーミングせずにフォルダにZipEntriesを追加してみてください。

しかし、多少大きめのJavaのZip APIの代わりに、ファイルシステム(Java7以降)を使用することができます。次の例は、Java8(ラムダ)の例です。

//Path pathToZip = Paths.get("path/to/your/folder"); 
//Path zipFile = Paths.get("file.zip"); 

public Path zipPath(Path pathToZip, Path zipFile) { 
    Map<String, String> env = new HashMap<String, String>() {{ 
     put("create", "true"); 
    }}; 

    try (FileSystem zipFs = FileSystems.newFileSystem(URI.create("jar:" + zipFile.toUri()), env)) { 
     Path root = zipFs.getPath("/"); 
     Files.walk(pathToZip).forEach(path -> zip(root, path)); 
    } 
} 

private static void zip(final Path zipRoot, final Path currentPath) { 

    Path entryPath = zipRoot.resolve(currentPath.toString()); 
    try { 
     Files.createDirectories(entryPath.getParent()); 
     Files.copy(currentPath, entryPath); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 

} 
+0

私はJava7で試してみたいが、ひどくJava 6で作業する必要がある。とにかく、「コンテンツをストリーミングせずにフォルダにZipEntriesを追加してみてください。 –

+0

ウィンドウにzipを作成して、7zipやjavaなどのツールで直接開き、エントリを表示してみてください。私が完全に間違っていない場合は、パスを表すエントリがあるか、またはそれらのようなもので始まる必要があります。しかし、確かに、あなたがどのようにzipのエントリを作成するかと、ウィンドウがそれを扱う方法(またはそうではない)との間に関連性があります。 –

関連する問題