# JFileChooser Pfadübergabe mit Leerzeichen geht nicht



## Stromausfall (9. Feb 2007)

Hallo,

ich bin neu in der Java Programmierung und hatte letztens einen 5 Tages Kurs.
Also daher bin ich noch ein richtiger Anfänger 

Ein Programm hatte ich schon lange im Kopf und nun wollte ich aufgrund des Kurses 
die Idee in Java realisieren.

Es geht um ein einfaches Programm, bei dem man mit Hilfe einer GUI einfach ein Quellverzeichnis und
ein Zielverzeichnis auswählt und dann per Knopfdruck einen Ordner kopiert.

Das Programm soll unter Macintosh und Linux funktionieren.
Geschrieben habe ich den Quellcode unter Mac und unter Windows.

Das Programm ist fertig und es funktioniert auch problemlos. 
Ein Freund hat mir geholfen, denn soweit wäre ich alleine nicht gekommen 

Nun funktioniert das Programm nur, solange kein Leerzeichen im Ordner Namen ist 
Dann wird der Copy Befehl nämlich nicht richtig übergeben.

Nur mal als Beispiel unter Windows:

>     xcopy C:\work D:\                       --funktioniert
>     xcopy C:\work to do D:\               --funktioniert nicht

Ist auch klar das der Befehl nicht klappt, da hier ja die Gänsefüßchen für den Pfad weg sind.

>    xcopy "C:\work to do" D:\            -- würde wieder funktionieren

Ich bin mir nicht sicher, aber ich habe das Gefühl, der JFileChooser Dialog übergibt
den Pfad schon nicht richtig.


```
private File oeffneDateidialog() {
        JFileChooser dialog = new JFileChooser();
        dialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        dialog.showOpenDialog(copyprogramm.this);
        File pfadname = dialog.getSelectedFile();
        
        return pfadname;
```

Das Ergebnis aus dem Dialog wird weitergegeben:


```
private void setzeQuellVerzeichnis() {
        //        Wenn der Anwender beim Dialog auf Abbrechen drückt kommt hier null an!
        File quelle = oeffneDateidialog();
        if (quelle != null) {
            cmd.setQuellVerzeichnis(quelle.toString());
```

und danach in einer anderen Klasse in einen String übergeben:


```
public String getBefehl() {
        xcopyBefehl= "xcopy" + getQuellVerzeichnis() + " " + getZielVerzeichnis();
        System.out.println(xcopyBefehl);
        
        return xcopyBefehl;
```

der dann ausgeführt wird:


```
public void xcopyAufruf() {
        try {
            Process proc = Runtime.getRuntime().exec(cmd.getBefehl());
        } catch (Throwable t) {
            t.printStackTrace();
```

Ich habe wirklich schon sehr viel Zeit mit Suchen verbracht.
Die Forums Hilfe habe ich auch schon benutzt. Aber irgendwie komme ich nicht weiter 
Der Befehl soll am Schluss mit Rsync funktionieren, aber um die ganze Sache erstmal
zu untersuchen, habe ich xcopy eingegeben.

Die Pfad Ermittlung über JFileChooser habe ich auch schon mit getPath, oder getAbsolutePath oder allen anderen
möglichen Methoden probiert.
Außerdem habe ich auch mal direkt einen String aus dem JFileChooserDialog zurückgeben lassen.

Klappt aber leider auch nicht.

Habt ihr vielleicht eine Idee oder einen Tipp für mich.
Ich würde das Programm ganz gerne nutzen 

Danke euch schonmal

Gruß
Markus


----------



## thE_29 (9. Feb 2007)

Ist zwar OT aber warum kopierst du die Dateien nicht einfach mit Java?!

Und der JFileChooser gibt dir den Pfad schon richtig zurück!

Du müsstest nur " hinparsen, weil woher soll der xcopy Befehl wissen, wenn du da ein Leerzeichen im Namen hast, dass das eigentlich noch immer das Verzeichnis ist und nicht ein anderer Parameter?!


Nachtrag: Verzeichnis kopieren http://www.exampledepot.com/egs/java.io/CopyDir.html


----------



## Stromausfall (9. Feb 2007)

Wie gesagt, es soll ja am Ende der Rsync Befehl anstatt der Copy Befehl rein.
Somit will ich ein simples Backup Programm erstellen. (rsync A zu B)
Rsync ändert dann nur noch inkrementell usw. und kopiert nicht immer alles komplett.

XCopy habe ich zum Testen nur genommen, da ich unter Windows Rsync ja nicht standardmässig dabei habe.

Wie genau kann ich das mit dem "hinparsen" machen ?

Danke und Gruß
Markus

Edit: Sorry, hätte das mit dem Rsync vielleicht vorher schon schreiben sollen.


----------



## thE_29 (12. Feb 2007)

Naja, du musst einfach einen Pfad mit Leerzeichen unter " " stellen, da er weiß dass das ganze nur 1 Parameter ist!

Das sollte es eigentlich gewesen sein!


----------



## Stromausfall (12. Feb 2007)

Danke für den Tipp 

Ich habe nun eine Lösung gefunden.
Vermutlich gibt es eine bessere und geschicktere Lösung, aber ich habs zumindest so hinbekommen.


```
private StringBuffer oeffneDateidialog() {
        JFileChooser dialog = new JFileChooser();
        dialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        dialog.showOpenDialog(superrsyncprogramm.this);
        String pfadname = dialog.getSelectedFile().getPath();
        StringBuffer pfadMitGaensefuesschen = new StringBuffer(pfadname); 
        char val = '"'; 
        pfadMitGaensefuesschen.insert( 0, val );   
        pfadMitGaensefuesschen.append(val);   
        
        return pfadMitGaensefuesschen;
```

Ich wusste mir nicht anders zu helfen und habe einfach das Ergebnis aus dem
File Dialog in einen StringBuffer übergeben und da dann die Anführungszeichen
hinzugefügt.

Jetzt ist nur noch die Frage ob das auch bei meinem Mac funktioniert.
Muss das die Tage mal testen.
Beim Mac sind nämlich Leerzeichen mit einem Backslash markiert.

Also z.B. "Users/markus/work to do" wird dann zu "Users/markus/work\ to \do".

Wie man das dann lösen könnte ist mir leider sehr schleierhaft.
Danke an thE_29 

Gruß
Markus


----------



## thE_29 (12. Feb 2007)

du hättest auch einfach mit + " adden können 

pfadname = "\"" + pfadName + "\"";

Das wars 

Und unter Linux werden Leerzeichen auch mit \ makiert! Aber es geht beides!

Also zB.: cd bla\ blu
oder cd "bla blu"

Geht bei mir beides


----------



## Stromausfall (12. Feb 2007)

Zitat: "du hättest auch einfach mit + " adden können"

Ja, das funktioniert auch und ist besser.
Meine Lösung war -- naja, sagen wir mal kreativ 

Also nochmal vielen vielen Dank.
Du kannst dir gar nicht vorstellen, wie sehr mich das freut.

Jetzt werde ich heute Abend noch ein bißchen den Code anpassen zwecks Mac und so und dann
bin ich mal gespannt.

Gruß
Markus


----------

