java.util.zip - Neuerstellung directory-Struktur

Beim Versuch das zip-Archiv mit der java.util.zip ich lief in eine Menge Probleme, die meisten, die ich gelöst. Jetzt, wo ich endlich eine Ausgabe, die ich Kampf mit immer den "richtigen" Ausgang. Ich habe einen extrahierten ODT-Datei (Verzeichnis wäre treffender Beschreibung), zu denen habe ich einige Modifikationen. Ich will jetzt komprimieren Sie dieses Verzeichnis zu erstellen Sie die ODT-Datei-Struktur. Zippen Sie das Verzeichnis und umbenennen Sie es zu Ende mit .odt funktioniert also sollte es kein problem sein.

Das Hauptproblem ist, dass ich verlieren die interne Struktur des Verzeichnisses. Alles wird "flach" und ich kann nicht scheinen, einen Weg finden, um die Erhaltung der ursprünglichen multi-layered structure. Ich würde schätzen etwas Hilfe, wie ich kann nicht scheinen, um das problem zu finden.

Hier sind die relevanten code-snippets:

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
    compressDirectory(TEMPARCH, out);

Den SEPARATOR ist die system-Datei-Trennzeichen und das FILEPATH ist der Dateipfad der original-ODT -, die ich überschreiben soll, aber es nicht getan haben, hier für Testzwecke. Ich habe einfach schreiben test.zip Datei in das gleiche Verzeichnis.

private void compressDirectory(String directory, ZipOutputStream out) throws IOException
{
    File fileToCompress = new File(directory);
    //list contents.
    String[] contents = fileToCompress.list();
    //iterate through directory and compress files.
    for(int i = 0; i < contents.length; i++)
    {
        File f = new File(directory, contents[i]);
        //testing type. directories and files have to be treated separately.
        if(f.isDirectory())
        {
            //add empty directory
            out.putNextEntry(new ZipEntry(f.getName() + SEPARATOR));
            //initiate recursive call
            compressDirectory(f.getPath(), out);
            //continue the iteration
            continue;
        }else{
             //prepare stream to read file.
             FileInputStream in = new FileInputStream(f);
             //create ZipEntry and add to outputting stream.
             out.putNextEntry(new ZipEntry(f.getName()));
             //write the data.
             int len;
             while((len = in.read(data)) > 0)
             {
                 out.write(data, 0, len);
             }
             out.flush();
             out.closeEntry();
             in.close();
         }
     }
 }

Dem Verzeichnis, das Dateien enthält zip ist irgendwo in den user-space und nicht im gleichen Verzeichnis wie die erstellte Datei. Ich nehme an, das könnte ärger geben, aber ich kann nicht wirklich sehen, wie. Auch ich dachte mir, dass könnte das problem sein, mit den gleichen stream für die Ausgabe aber wieder ich kann nicht sehen, wie. Ich sah in einigen Beispielen und tutorials, die Sie verwenden getPath() statt getName() aber ändern, das gibt mir eine leere zip-Datei.

InformationsquelleAutor der Frage Eric | 2009-09-09

Schreibe einen Kommentar