Ordner in neuen erstellten Ordner erstellen

learningbydoing

Aktives Mitglied
Hallo zusammen,

ich bin noch neu in der Java Welt und habe jetzt den Versuch gestartet, ein kleines Programm zu entwerfen.

Ich möchte einen Ordner auf dem Desktop erstellen, den ich selbst benenne und anschließend sollen in diesen, 3 vorbenannte Ordner erstellt werden.

Meine Frage:
Wie setze ich den Pfad in den neu erstellten Ordner, damit die anderen in diesem erstellt werden können?

Hier der Code:
[CODE lang="java" highlight="20"]import java.io.File;
import java.util.Scanner;


public class OrdnerErsteller {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Wo soll der Ordner erstellt werden?
String path1 = "C:\\Users\\Hier ist der Name\\Desktop\\";
String path;
// Abfrage des Ordnernamens vom User
System.out.println("Gib den Namen für den Ordner ein: ");
path = path1 +sc.next();
// Initialisierung der File Klasse
File f0 = new File(path);
// Ordner erstellen
boolean bool0 = f0.mkdir();

// Bis hier hin funktioniert der Code

path = path + "PNGs";
File f1 = new File(path);
boolean bool1 = f1.mkdir();


path = path + "JPEGs";
File f2 = new File(path);
boolean bool2 = f2.mkdir();


path = path + "RAWs";
File f3 = new File(path);
boolean bool3 = f3.mkdir();


// Überprüfung, ob alles funktioniert hat
if(bool0){
System.out.println("Folder is created successfully");
}else{
System.out.println("Error Found!");
}

if(bool1){
System.out.println("Folder is created successfully");
}else{
System.out.println("Error Found!");
}

if(bool2){
System.out.println("Folder is created successfully");
}else{
System.out.println("Error Found!");
}

if(bool3){
System.out.println("Folder is created successfully");
}else{
System.out.println("Error Found!");
}

}
}[/CODE]

Vielen Dank schon einmal im Voraus!
 
Du kannst Pfade zusammenfügen z.B. mit Paths.get: https://docs.oracle.com/javase/8/do...tml#get-java.lang.String-java.lang.String...-

Noch ein paar weitere Ratschläge:
a) Nutze als Pfadtrenner auch unter Windows den /. Java unterstützt das auch. Also kein Backslash!
b) Den Ordner des Users kannst Du über die System Property user.home bekommen (System.getProperty("user.home")). Aber Achtung: Prüfe, ob es den Desktop als Verzeichnis wirklich gibt. Das kann der Fall sein, aber es muss nicht!
c) Strukturiere den Code etwas um: statt erst etwas zu machen um dann später eine Variable zu prüfen, die die Rückgabe enthält: Prüfe die Rückgabe sofort. Und wenn Du mehrmals das Gleiche machst: Lagere es aus in eine Methode. Das wäre dann sowas in der Art:
Java:
private void makeDirectory(String path) {}
    File file = new File(path);
    if(file.mkdir()){
        System.out.println("Folder is created successfully");
    }else{
        System.out.println("Error Found!");
    }
}
Das nur um ein kleines Beispiel zu geben. Das ist also alles andere als ein umfängliches Refactoring.
 
Puuh🙄!
Erstmal, vielen Dank!
Ich tu mir gerade schwer, wie ich das am besten umsetzen kann.
Könntest du mir hierfür vielleicht noch eine Hilfestellung geben?
VG
 
Mal einfach so ein kleines Codebeispiel, das Verzeichnisse erzeugt.

Aber noch einmal: Das Verzeichnis Desktop muss es nicht geben! Ich habe kein solches Verzeichnis auf meinem Windows 10 System (Da wurde das Verzeichnis umgezogen - weil es mit Synchronisiert wird und so.)

Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CreateFoldersExample {

    public static void main(String[] args) {
        createFolderOnDesktop("a", "b");
    }

    public static void createFolderOnDesktop(final String... folderNames) {
        String userHome = System.getProperty("user.home");
        Path desktopPath = Paths.get(userHome, "Desktop");
        if (Files.isDirectory(desktopPath)) {
            for (String folderName : folderNames) {
                createDirectory(desktopPath, folderName);
            }
        } else {
            System.out.println("Folder " + desktopPath + " does not exist!");
        }
    }

    public static void createDirectory(final Path parent, final String folderName) {
        try {
            System.out.println("creating folder " + folderName + " in " + parent);
            Files.createDirectory(Paths.get(parent.toString(), folderName));
        } catch (IOException ex) {
            System.err.println("Unable to create folder " + folderName + " in " + parent + ": " + ex.getMessage());
            ex.printStackTrace();
        }
    }

}
 
Ok ich habe es jetzt soweit umgeändert und einen Teil von dir eingebaut. Die Vereinfachung des Codes, versuche ich bei einem besseren Wissensstand.
Jetzt habe ich nur noch ein Problem: Wenn ich bei der Abfrage nach dem Ordnernamen, z.B. Österreich - 31.03.21 eingebe, wird der Ordner nur als Österreich erstellt. Bei einem String müsste doch jedes Zeichen mitgenommen werden?

Java:
import java.io.File;
import java.util.Scanner;


public class OrdnerErsteller {

    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      // Wo soll der Ordner erstellt werden?   
      String path1 = System.getProperty("user.home") + "/Desktop/";
      // Abfrage des Ordnernamens vom User
      System.out.println("Gib den Namen für den Ordner ein: "); 
      path1 = path1 + sc.next();
      // Initialisierung der File Klasse   
      File f0 = new File(path1); 
      // Ordner erstellen
      boolean bool0 = f0.mkdir();
      
    
      String path2;
      path2 = path1 + "/PNGs";
      File f1 = new File(path2);
      boolean bool1 = f1.mkdir();
      
      String path3;
      path3 = path1 + "/JPEGs";
      File f2 = new File(path3);
      boolean bool2 = f2.mkdir();
      
      String path4;
      path4 = path1 + "/RAWs";
      File f3 = new File(path4);
      boolean bool3 = f3.mkdir();
      
      
      // Überprüfung, ob alles funktioniert hat
      if(bool0){ 
         System.out.println("Folder is created successfully"); 
      }else{ 
         System.out.println("Error Found!"); 
      }
      
      if(bool1){ 
         System.out.println("Folder is created successfully"); 
      }else{ 
         System.out.println("Error Found!"); 
      }
      
      if(bool2){ 
         System.out.println("Folder is created successfully"); 
      }else{ 
         System.out.println("Error Found!"); 
      }
      
      if(bool3){ 
         System.out.println("Folder is created successfully"); 
      }else{ 
         System.out.println("Error Found!"); 
      }
      
   } 
}
 
Du nutzt sc.next() um den Dateinamen einzulesen. next() liefert aber nur das nächste Token.
Wenn Du die ganze Eingabe (die ganze Zeile) haben willst, dann musst du nextLine() statt next() nehmen.

Und immer aufpassen: Wenn Du auch token basiert mit dem Scanner arbeitest (also dies "mischst"), dann kann das nextLine() den optionalen Rest + Zeilenumbruch vom letzten next, nextInt, ... bekommen!

Und eine Frage hätte ich hierzu: Funktioniert das dann auch 1:1 auf einem Mac, also ohne das ich den Code verändern muss?
Ja, das sollte auch auf einem Mac laufen. Aber Apple sichert alles relativ gut ab. Damit eine Applikation auf User-Dateien zugreifen kann braucht die App ggf. erst eine Berechtigung. Ich habe keinen Mac mehr im Einsatz (ok, falsch, ich habe noch Macs im Einsatz aber die laufen mit Linux 🙂 ), daher kann ich da aktuell auch nichts mehr austesten. Aber ich erinnere mich noch, dass da etwas war.
 
Vielen Dank für die schnelle Rückmeldung😀!
Jetzt muss ich nur noch eine ganz einfache GUI entwickeln, damit ich das Programm auch ohne IDE ausführen kann. Hast du da vielleicht noch einen Tipp wie man das schnell und einfach für meinen Fall machen kann🙂?
 
Also man braucht nicht zwingend eine GUI damit man etwas ohne IDE ausführen kann.

Das geht aber ggf. jetzt recht weit, wenn man das alles ausführen wollte.

Wenn ein entsprechendes Java installiert ist, reicht es aber schon, die übersetzten class Dateien weiter zu geben. Ggf. noch ein script, dass dann den java Befehl ausführt.

Wenn Du da möglichst wenig Abhängigkeiten haben willst, dann würde es meiner Meinung nach Richtung JLink und JPackage gehen.
 
Mit File#mkdirs() kannst Du alle Verzeichnisse auf dem angegeben Pfad (Klasse File) erzeugen.

Mehrfach-Aufruf ist kein Problem, wenn die Verzeichnisse vorhanden sind, wird einfach nichts gemacht.
 
So schön es ist, ganze Strukturen anlegen zu können sollte man dennoch die Voraussetzungen prüfen. Sprich: auf dem Desktop soll hier etwas angelegt werden: der Desktop Ordner sollte schon da sein und das prüft man bitte vorher.

Dieser Check sollte auf keinem Fall entfallen! (Klar, das hat niemand gefordert. Ich betone es nur, weil ich da leider schon zu viel erlebt habe.)
 

Zurück
Oben