2016-04-26 7 views
0

Ich wollte ein Verzeichnis mit Dateien und Unterverzeichnissen darin komprimieren. Ich tat dies und funktionierte gut, aber ich bekomme und ungewöhnliche und neugierige Dateistruktur (zumindest sehe ich es so). DieseMerkwürdige Strukturdatei beim Zippen eines Verzeichnisses mit Java

ist die erstellte Datei: Empty zip file Wenn ich darauf klicke, sehe ich ein „leeres“ Verzeichnis wie folgt aus: enter image description here aber wenn ich diese entpacken ich diese Dateistruktur sehen (nicht alle Namen sind exacly, wie sie in gezeigt sind, das Bild unten):

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

Mein Problem ist, irgendwie, dass der Ordner „mantenimiento“ ist, wo ich aus (das Verzeichnis bin zippping, die ich zip wollen), und ich möchte nicht dort sein, also wenn ich entpacken die gerade erstellte .zip-Datei Ich will es mit dieser Dateistruktur (das sind die Dateien und Verzeichnisse im "mantenimiento" -Verzeichnis): Correct directory structure und die andere Sache ist, wenn ich auf die .zip-Datei klicke Ich möchte die Dateien sehen a nd Verzeichnisse wie das oben gezeigte Bild.

Ich weiß nicht, was ist falsch mit meinem Code, ich habe gesucht, aber habe keinen Verweis auf, was mein Problem sein könnte.

Hier ist mein Code:

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(); 
    } 

} 

hoffen, ihr mir einen Hinweis geben können, was ich falsch mache oder was ich fehle.

Vielen Dank.

Btw, das Verzeichnis, das ich der Methode gebe, wird nie benutzt. Der andere Parameter, den ich gebe, ist eine Liste von Dateien, die alle Dateien und Verzeichnisse aus dem Verzeichnis C: \ mantenimiento enthält.

+0

können Sie GetZipFileName-Methode freigeben. – Sanj

+0

Diese Methodenimplementierung ist sehr einfach: private String getZipFileName method() { \t String zipName; \t \t Datum currentDate = newDate(); \t \t SimpleDateFormat Formatierer = SimpleDateFormat ("yyyy_MM_dd_HH-mm-ss"); \t \t zipName = formatter.format (aktuellerDatum); \t \t Rückgabe zipName; \t } –

Antwort

0

Ich hatte einmal ein Problem mit Windows und Zip-Dateien, wo die erstellte ZIP nicht die Einträge für die Ordner (d. H. /, /Carpeta_A usw.) nur die Dateieinträge enthielt. Versuchen Sie, ZipEntries für die Ordner ohne Streaming-Inhalt hinzuzufügen.

Aber als Alternative zu der etwas sperrigen Zip-API von Java könnte man stattdessen Dateisystem (seit Java7) verwenden. Das folgende Beispiel ist für Java8 (Lambda):

//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

Ich möchte es mit Java7 versuchen, wie Sie empfohlen haben, aber bedauerlicherweise muss ich mit Java 6 arbeiten. Wie auch immer, ich werde diesen Ansatz versuchen "Versuchen Sie ZipEntries für die Ordner ohne Streaming-Inhalte hinzuzufügen." –

+0

versuche, eine zip in windows zu erstellen und öffne sie mit einem tool wie 7zip oder mit java direkt und leite die einträge auf. Wenn ich nicht völlig falsch bin, sollte es entweder Einträge geben, die Pfade bezeichnen, oder sie beginnen mit einem/ähnlichem. Aber es gibt sicherlich eine Verbindung zwischen dem, wie Sie die Einträge der ZIP erstellen und wie Windows damit umgehen kann (oder nicht) –