Ordnernamen fehlerhaft beim Erstellen von ZIP-File

oloesch

Grünschnabel
Hi Leute,

ich hab mir ein kleines Programm geschrieben, dass mir einen Ordner den ich angebe komprimiert in eine ZIP-Datei.
Das funktioniert auch, doch das Problem hierbei ist, dass manche Ordner ein Leerzeichen enthalten und beim ZIP-Vorgang dieses Leerzeichen durch %20 ersetzt wird. Sprich aus dem Ordner "Program Files" wird "Program%20Files". Dies will ich aber vermeiden. Ist da was an meiner Methode falsch oder hat jemand eine andere Idee an was das liegen könnte?

Code:
public static void main(String[] args) {

System.out.println("Erstelle ZIP-Archiv...");
ZipOutputStream zipOut;
zipOut = new ZipOutputStream(new FileOutputStream("C:\\Users\\oloesch\\Archiv.zip"));
ZipOperation zip = new ZipOperation(zipOut, new File("C:\\Users\\oloesch\\Dateien"));
zip.zipIt();
zipOut.close();
System.out.println("ZIP-File wurde gespeichert!");
}

Im Ordner "Dateien" sind jetzt die genannten Order wie z.B. "Neuer Ordner" oder "Program Files" usw. und es ist nicht gewollt dass diese umbenannt werden. Diese sollen so bleiben wie sie sind.

Code:
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipOperation {

private static byte[] buffer = new byte[8192];
private static int len = 0;
private ZipOutputStream zipOut;
private File file;
    
//Konstruktor
public ZipOperation(ZipOutputStream zipOut, File file) {
  		this.zipOut = zipOut;
  		this.file = file;
}
  	
//Add to Zip-Archiv
public void zipIt() throws Exception {
  	treeWalkAndCompressTo(file, file.getParentFile().toURI(), zipOut);
  	zipOut.close();
}
    
  	
private static void treeWalkAndCompressTo(File file, URI relateTo, ZipOutputStream zipOut) throws Exception {
        zipOut.setLevel(9);
    	if (!file.isDirectory()) {
            URI relativePath = relateTo.relativize(file.toURI());
            ZipEntry entry = new ZipEntry(relativePath.toString());
            zipOut.putNextEntry(entry);
            
            FileInputStream fis = new FileInputStream(file);
            while ((len = fis.read(buffer)) > 0) {
                zipOut.write(buffer, 0, len);
            }
            fis.close();
            zipOut.closeEntry();
        } else {
            File[] children = file.listFiles();
            for (int i = 0; i < children.length; i++) {
                File child = children[i];
                treeWalkAndCompressTo(child, relateTo, zipOut);
            }
        }
    }
}

Hoffe ihr könnt mir helfen :)
 
Moin,

so ganz habe ich Dein Problem nicht verstanden resp. kann es nicht wirklich Deinem Code zuordnen ...

Aber das "%20" maskiert hier das Blank (= 0x20).

Hast Du ggf. mal versucht, falls das "%20" in einem Namen/Ordner vorkommt, es durch ein echtes Blank zu ersetzen?

Gruß
Klaus
 
Ich versuch das nochmal genauer zu erläutern.
Also:

Ich habe einen Ordner den ich mitsamt aller Unter-Ordner und Dateien in ein ZIP-File komprimieren will.
Der Ordner heißt hier "Dateien" und ist zu finden unter C:\\Users\\oloesch\\Dateien
Der Ordner Dateien enthält mehrere Dateien und Ordner. Das sieht wie folgt aus:

C:\Users\oloesch\Dateien\Neuer Ordner\datei.dat
C:\Users\oloesch\Dateien\Neuer Ordner\zyx.cfg
C:\Users\oloesch\Dateien\Bilder\abc.jpg
C:\Users\oloesch\Dateien\Bilder\xyz.jpg
C:\Users\oloesch\Dateien\datei.dat
....

Und dieser Ordner Dateien (C:\Users\oloesch\Dateien\) soll nun komprimiert werden, also es soll ein ZIP-File erstellt werden, sprich Dateien.zip , welches all die Ordner und Dateien enthält wie der Ordner "Dateien". Ohne Java wäre das einfach Rechtsklick drauf und "Zum Archiv hinzufügen" klicken.

Wie oben zu sehen ist, ist im Ordner "Dateien" ein Ordner dessen name ein Leerzeichen enthält (Neuer Ordner, C:\Users\oloesch\Dateien\Neuer Ordner\)
Wenn ich das nun mit meinem Code zu einem ZIP-File (ZIP-Archiv) mache, macht er statt des Leerzeichen das %20. Und dieses %20 will ich da nicht drin haben.
Da es aber im Original Ordner, den ich komprimiere, nicht als %20 dargestellt wird, kann ich auch nicht nach %20 suchen und durch ein echtes Blank ersetzen.


Ich hoffe, man kann mein problem nun verstehen.

Gruß
Oliver
 
Hi

Wo siehst du das %20?
Wenn du dir mit Java den Archivinhalt auflisten lasst
oder wenn du die Zipdatei außerhalb von Java mit den vorhandenen Sachen öffnest?

Was kommt raus, wenn du die Datei javamäßig wieder entpackst?

PS: Nachträglich Willkommen bei tutorials.de :)
 
Danke :)

Die %20 sehe ich wenn ich die ZipDatei außerhalb von Java öffne.
Mit java wieder entpacken hab ich nicht für mein programm vorgesehen, da die Zipdatei zur Ablage (Dokumentationen, usw.) gedacht ist und nur falls man sie später nochmal brauchen sollte geöffnet und entpackt wird und ich hier dann gerne den Pfad ohne die %20 Zeichen hätte.
Ich glaube, dass das Problem hier bei der toURI-Methode liegt, allerdings weiß ich nicht wie ich den Ordner zu einer Zipdatei komprimieren soll ohne die toURI-Methode.
 
Habs hingekriegt.
Hab einfach nach der toString()-Methode ein replaceAll eingefügt.

Code:
ZipEntry entry = new ZipEntry(relativePath.toString().replaceAll("%20", " "));

Mensch, jetzt bin ich wegen so ner Kleinigkeit so lange davor gesessen.
Trotzdem danke für die Hilfe. :)
 
Zurück