Liebe Java-Community,
ich habe eine grafische Benutzeroberfläche für das Konsolenprogramm chmod geschrieben, allerdings gibt es bei Datei- und Ordnernamen mit Leerzeichen noch Probleme. Für die grafische Oberfläche nutze ich JavaFX.
In meinem Fenster befindet sich ein Button, von dem aus man einen FileChooser öffnen kann. Wenn man nun mit dem FileChooser eine Datei auswählt, wird der Dateipfad im File-Objekt gespeichert. Den Dateipfad speichere ich dann in einer weiteren String. Mit einer if-Abfrage wird geprüft, ob in dem Dateipfad Leerzeichen vorkommen. Wenn das der Fall ist, wird das String mit der Methode split bei den Schrägstrichen in seine Bestandteile (also die Ordner) zerlegt und in einem String-Array gespeichert. Mit der Methode join werden die Array-Elemente in einem weiteren String wieder zusammengefügt und an jedes Element wird vorne ein '/ angehängt. Im nächsten Schritt wird mit der Methode replaceAll das '/ durch '/' ersetzt, ganz hinten ein ' angehängt und in einer weiteren String abgespeichert. Im letzten Schritt wird mit der Methode substring aus der vorherigen String der Teil nach dem ersten ' in einer neuen String gespeichert. Diese wird dann als Dateipfad verwendet.
Nun wird in einer neuen String entsprechend den Nutzereingaben der chmod-Befehl erzeugt und dann als
Process p = Runtime.getRuntime().exec(Befehl);
ausgeführt.
Nun lasse ich mir mit System.out.println noch den Befehl ausgeben, der dem Process übergeben wird.
Wenn ich nach dem Ausführen durch Java mir im Terminal mit ls -l die Zugriffsrechte anzeigen lasse, hat sich allerdings nichts geändert. Kopiere ich mir stattdessen den ausgegebenen Befehl und führe ihn im Terminal aus, funktioniert alles einwandfrei.
Hier ist der Code zur Erzeugung des Dateipfades:
Hier ist der Code zur Erzeugung des Befehls:
Wo liegt das Problem?
Für eure Hilfe danke ich euch im Voraus.
ich habe eine grafische Benutzeroberfläche für das Konsolenprogramm chmod geschrieben, allerdings gibt es bei Datei- und Ordnernamen mit Leerzeichen noch Probleme. Für die grafische Oberfläche nutze ich JavaFX.
In meinem Fenster befindet sich ein Button, von dem aus man einen FileChooser öffnen kann. Wenn man nun mit dem FileChooser eine Datei auswählt, wird der Dateipfad im File-Objekt gespeichert. Den Dateipfad speichere ich dann in einer weiteren String. Mit einer if-Abfrage wird geprüft, ob in dem Dateipfad Leerzeichen vorkommen. Wenn das der Fall ist, wird das String mit der Methode split bei den Schrägstrichen in seine Bestandteile (also die Ordner) zerlegt und in einem String-Array gespeichert. Mit der Methode join werden die Array-Elemente in einem weiteren String wieder zusammengefügt und an jedes Element wird vorne ein '/ angehängt. Im nächsten Schritt wird mit der Methode replaceAll das '/ durch '/' ersetzt, ganz hinten ein ' angehängt und in einer weiteren String abgespeichert. Im letzten Schritt wird mit der Methode substring aus der vorherigen String der Teil nach dem ersten ' in einer neuen String gespeichert. Diese wird dann als Dateipfad verwendet.
Nun wird in einer neuen String entsprechend den Nutzereingaben der chmod-Befehl erzeugt und dann als
Process p = Runtime.getRuntime().exec(Befehl);
ausgeführt.
Nun lasse ich mir mit System.out.println noch den Befehl ausgeben, der dem Process übergeben wird.
Wenn ich nach dem Ausführen durch Java mir im Terminal mit ls -l die Zugriffsrechte anzeigen lasse, hat sich allerdings nichts geändert. Kopiere ich mir stattdessen den ausgegebenen Befehl und führe ihn im Terminal aus, funktioniert alles einwandfrei.
Hier ist der Code zur Erzeugung des Dateipfades:
Java:
if (dateipfad.contains(" "))
{
String [] dateiArray = dateipfad.split("/");
//Dateipfad mit Anführungszeichen bauen
String zusammen = String.join("/'", dateiArray);
String zusammen2 = zusammen.replaceAll("/'", "'/'")+ "'";
zusammen3 = zusammen2.substring(1);
};
Hier ist der Code zur Erzeugung des Befehls:
Java:
try {
if (andere.getSource()==OK) {
boolean SchreibenString = SchreibenCB.isSelected();
boolean LesenString = LesenCB.isSelected();
boolean AusfuehrenString = AusfuehrenCB.isSelected();
boolean rekursivString = rekursiv.isSelected();
if (EVString.equals("Entziehen")) {EVParameter="-";};
if (EVString.equals("Vergeben")) {EVParameter="+";};
if (SchreibenString==true) {
w="w";
} else {w="";};
if (LesenString==true) {
r="r";
} else {r="";};
if (AusfuehrenString==true) {
x="x";
} else {x="";};
if (BenutzerString.equals("Ihnen")) {BenutzerParameter="u";};
if (BenutzerString.equals("Allen außer Ihnen")) {BenutzerParameter="o";};
if (BenutzerString.equals("Gruppe")) {BenutzerParameter="g";};
if (BenutzerString.equals("Allen")) {BenutzerParameter="a";};
if (rekursivString==true) {rekursivParameter= "-r";}
else {rekursivParameter="";};
//Erzeugen und Ausgabe des Befehls
String Befehl = ("chmod " + rekursivParameter + " " + BenutzerParameter + EVParameter + w+r+x + " " + zusammen3);
System.out.println(Befehl);
//Ausführen des Befehls.
try {
Process p = Runtime.getRuntime().exec(Befehl);
} catch (IOException e) {
// TODO Auto-generated catch block
Fehler.setText("Fehler");
}
}}
catch (java.lang.NullPointerException f) {Fehler.setText("Es wurden noch nicht alle Daten eingegeben.");}
}
Wo liegt das Problem?
Für eure Hilfe danke ich euch im Voraus.
Zuletzt bearbeitet von einem Moderator: