Wie erstelle ich ein Verzeichnis in Java?

387

Wie erstelle ich ein Verzeichnis / einen Ordner?

Sobald ich getestet habe System.getProperty("user.home");

Ich muss genau dann ein Verzeichnis (Verzeichnisname "neuer Ordner") erstellen, wenn kein neuer Ordner vorhanden ist.

Jimmy
quelle
24
Bitte überprüfen Sie Ihre Auswahl der richtigen Antwort. Die von JigarJoshi vorgeschlagene Lösung ist irreführend. Das Problem wird nicht richtig behoben (siehe meinen Kommentar). Die von Bozho vorgeschlagene (einfache) Lösung ist viel besser.
mwhs
mkdirist in Java idempotent. Die Implementierung überprüft, ob das Verzeichnis für Sie vorhanden ist, und erstellt es nur, wenn es nicht vorhanden ist.
mwhs

Antworten:

461

Nach ~ 7 Jahren werde ich es auf einen besseren Ansatz aktualisieren, der von Bozho vorgeschlagen wird.

new File("/path/directory").mkdirs();

Veraltet:

File theDir = new File("new folder");

// if the directory does not exist, create it
if (!theDir.exists()) {
    System.out.println("creating directory: " + theDir.getName());
    boolean result = false;

    try{
        theDir.mkdir();
        result = true;
    } 
    catch(SecurityException se){
        //handle it
    }        
    if(result) {    
        System.out.println("DIR created");  
    }
}
Jigar Joshi
quelle
241
-1: Das ist eine wirklich schlechte Technik, um ein Verzeichnis zu erstellen. Der Zugriff auf den FS ist nicht einer dedizierten Ressource vorbehalten. Zwischen if(!theDir.exists())und theDir.mkdir()der Status geändert haben könnte, sowie es zwischendurch ändern könnte nicht Erstellen des Verzeichnisses (wegen der existsRückkehr true) und benötigen es. Das Ergebnis der Methode existssollte niemals verwendet werden, um zu entscheiden, ob ein Verzeichnis erstellt werden soll oder nicht. Rufen Sie einfach an mkdir, es wird keine Ausnahme ausgelöst, wenn sie bereits vorhanden ist.
mwhs
4
@mwhs Ich verstehe, dass es besser ist, nicht nach dem Verzeichnis zu suchen, aber ich verstehe Ihre Rechtfertigung nicht (zweiter Teil). Kann sich der Status nicht auch zwischen Aufrufen mkdirund Benötigen des Verzeichnisses ändern ? Ich nehme an, Sie haben gemeint, dass ein anderer Prozess das Verzeichnis löscht.
Episodex
2
@ Episodex-Verzeichnisse sind gemeinsam genutzte Ressourcen. Verwenden Sie die oben genannte Lösung nur nicht, sie ist aus verschiedenen Gründen falsch. Unklar, wie die PO gedacht haben könnte, dass dies die richtige Antwort ist. Wenn Sie Zusicherungen zu E / A-Ressourcen wünschen, müssen Sie Sperren verwenden, keine Booleschen Werte.
mwhs
44
@mhws Ich weiß, dass dieser Beitrag ein paar Monate alt ist, aber wenn Sie sich die mkdirsImplementierung aus dem Quellcode ansehen , wird als erstes aufgerufen if (exists()) { return false; }. Die Implementierung selbst prüft zuerst, ob das Verzeichnis bereits vorhanden ist. Das einzige, woran diese Antwort schuld ist, ist möglicherweise die Überprüfung dieser Bedingung 2x. Nicht annähernd so schlimm, wie du es dir vorstellst.
Michael Hogenson
5
Ab Java 7 sollten Sie die Methoden wahrscheinlich Fileswie in der neueren Antwort von Benoit Blanchon verwenden. (Diese Antwort scheint vor Java 7 geschrieben worden zu sein.)
Brick
504
new File("/path/directory").mkdirs();

Hier ist "Verzeichnis" der Name des Verzeichnisses, das Sie erstellen / existieren möchten.

Bozho
quelle
30
Viel bessere Antwort als die vom OP als die richtige ausgewählte. Das Überprüfen der Existenz des Verzeichnisses vor dem Erstellen sollte zu einem bekannten Anti-Pattern werden.
mwhs
7
Was ist, wenn das Verzeichnis bereits vorhanden ist? Es würde überschreiben? oder überspringen Sie den Vorgang.
Avinash Raj
3
@ AvashashRaj überprüfen Sie bitte docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs ()
Tascalator
1
@Tascalator es ist nicht klar aus der Dokumentation können Sie näher darauf eingehen? Die Antwort sollte auch durch die Antwort auf die what if the directory is already exists? It would do overwriting? or skip the process.Frage ergänzt werden.
Mrgloom
3
es ist klar:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus
147

Mit Java 7 können Sie verwenden Files.createDirectories().

Zum Beispiel:

Files.createDirectories(Paths.get("/path/to/directory"));
Benoit Blanchon
quelle
12
Ich denke, diese Option gab es zum Zeitpunkt der ursprünglichen Fragen und Antworten noch nicht, aber ich denke, dies sollte die Antwort für die Zukunft sein.
Brick
6
Es wäre auch gut zu beachten, dass:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS
Vielen Dank, dass Sie auf den Unterschied zwischen createDirectory und createDirectories hingewiesen haben. Ich finde es eine schlechte Namenswahl.
Seinecle
(2019) Ich habe Files.createDirectory (Paths.get (directory.toString ())) verwendet. Dabei ist das Verzeichnis ein Dateiobjekt. Vergessen Sie nicht, Ihre IOException zu fangen
chrips
@chrips Dann ist es besser directory.toPath().
Ruslan Stelmachenko
37

Sie können FileUtils # forceMkdir ausprobieren

FileUtils.forceMkdir("/path/directory");

Diese Bibliothek hat viele nützliche Funktionen.

Ahvargas
quelle
1
Viel besser als reine mkdirs: Behandelt Parallelität, prüft, ob der Vorgang erfolgreich war, prüft, ob das Verzeichnis (keine Datei!) Existiert.
Andrey
28

mkdir vs mkdirs


Wenn Sie ein einzelnes Verzeichnis erstellen möchten, verwenden Sie mkdir

new File("/path/directory").mkdir();

Wenn Sie eine Hierarchie der Ordnerstruktur erstellen möchten, verwenden Sie mkdirs

 new File("/path/directory").mkdirs();
Buru
quelle
21
  1. Erstellen Sie ein einzelnes Verzeichnis.

    new File("C:\\Directory1").mkdir();
  2. Erstellen Sie zusammen ein Verzeichnis mit dem Namen "Directory2" und alle Unterverzeichnisse "Sub2" und "Sub-Sub2".

    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()

Quelle: In diesem perfekten Tutorial finden Sie auch ein Anwendungsbeispiel.

Mouna
quelle
15

Für Java 7 und höher:

Path path = Paths.get("/your/path/string");
Files.createDirectories(path);

Es scheint unnötig, vor dem Erstellen von createDirectories-Javadocs zu überprüfen, ob das Verzeichnis oder die Datei vorhanden ist :

Erstellt ein Verzeichnis, indem zuerst alle nicht vorhandenen übergeordneten Verzeichnisse erstellt werden. Im Gegensatz zur Methode createDirectory wird keine Ausnahme ausgelöst, wenn das Verzeichnis nicht erstellt werden konnte, da es bereits vorhanden ist. Der Parameter attrs ist ein optionales Dateiattribut, das beim Erstellen der nicht vorhandenen Verzeichnisse atomar festgelegt werden kann. Jedes Dateiattribut wird durch seinen Namen identifiziert. Wenn mehr als ein Attribut mit demselben Namen im Array enthalten ist, werden alle bis auf das letzte Vorkommen ignoriert.

Wenn diese Methode fehlschlägt, kann dies nach dem Erstellen einiger, aber nicht aller übergeordneter Verzeichnisse geschehen.

groo
quelle
7

Die folgende Methode sollte das tun, was Sie wollen. Stellen Sie nur sicher, dass Sie den Rückgabewert von mkdir () / mkdirs () überprüfen.

private void createUserDir(final String dirName) throws IOException {
    final File homeDir = new File(System.getProperty("user.home"));
    final File dir = new File(homeDir, dirName);
    if (!dir.exists() && !dir.mkdirs()) {
        throw new IOException("Unable to create " + dir.getAbsolutePath();
    }
}
Jon Freedman
quelle
2
Wie in dem Kommentar von @mwhs zu Jigar Joshis Antwort erwähnt, ist es nicht nur nicht notwendig, zuerst auf Existenz zu prüfen, sondern auch eine schlechte Idee.
Bdoserror
4

Obwohl diese Frage beantwortet wurde. Ich möchte etwas extra hinzufügen, dh wenn eine Datei mit dem Verzeichnisnamen vorhanden ist, den Sie erstellen möchten, sollte dies zu einem Fehler führen. Für zukünftige Besucher.

public static void makeDir()
{
    File directory = new File(" dirname ");
    if (directory.exists() && directory.isFile())
    {
        System.out.println("The dir with name could not be" +
        " created as it is a normal file");
    }
    else
    {
        try
        {
            if (!directory.exists())
            {
                directory.mkdir();
            }
            String username = System.getProperty("user.name");
            String filename = " path/" + username + ".txt"; //extension if you need one

        }
        catch (IOException e)
        {
            System.out.println("prompt for error");
        }
    }
}
Ergebnis
quelle
3
Wie in dem Kommentar von @mwhs zu Jigar Joshis Antwort erwähnt, ist es nicht nur nicht notwendig, zuerst auf Existenz zu prüfen, sondern auch eine schlechte Idee.
Bdoserror
4

Ordentlich und sauber:

import java.io.File;

public class RevCreateDirectory {

    public void revCreateDirectory() {
        //To create single directory/folder
        File file = new File("D:\\Directory1");
        if (!file.exists()) {
            if (file.mkdir()) {
                System.out.println("Directory is created!");
            } else {
                System.out.println("Failed to create directory!");
            }
        }
        //To create multiple directories/folders
        File files = new File("D:\\Directory2\\Sub2\\Sub-Sub2");
        if (!files.exists()) {
            if (files.mkdirs()) {
                System.out.println("Multiple directories are created!");
            } else {
                System.out.println("Failed to create multiple directories!");
            }
        }

    }
}
Program-Me-Rev
quelle
4

Nun, um Verzeichnis / Ordner in Java zu erstellen, haben wir zwei Methoden

Hier erstellt die makedirectory-Methode ein einzelnes Verzeichnis, wenn es nicht vorhanden ist.

File dir = new File("path name");
boolean isCreated = dir.mkdir();

Und

File dir = new File("path name");
boolean isCreated = dir.mkdirs();

Hier erstellt die makedirectories-Methode alle Verzeichnisse, die im Pfad fehlen, den das Dateiobjekt darstellt.

Zum Beispiel siehe Link unten (sehr gut erklärt). Ich hoffe es hilft!! https://www.flowerbrackets.com/create-directory-java-program/

Shiva
quelle
3

Ich wollte nur alle anrufen , die anrufen, File.mkdir()oder File.mkdirs()darauf achten, dass das FileObjekt ein Verzeichnis und keine Datei ist. Wenn Sie beispielsweise mkdirs()den Pfad aufrufen /dir1/dir2/file.txt, wird ein Ordner mit dem Namen erstellt, file.txtder wahrscheinlich nicht Ihren Wünschen entspricht. Wenn Sie eine neue Datei erstellen und automatisch übergeordnete Ordner erstellen möchten, können Sie Folgendes tun:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }
Matt Bonness
quelle
2

So funktioniert es für mich, ein einzelnes Verzeichnis oder mehrere oder mehrere zu erstellen: java.io.File muss importiert werden;
/ * Geben Sie den folgenden Code ein, um ein diectory dir1 hinzuzufügen, oder überprüfen Sie, ob dir1 vorhanden ist. Wenn dies nicht der Fall ist, erstellen Sie es und dasselbe mit dir2 und dir3. * /

    File filed = new File("C:\\dir1");
    if(!filed.exists()){  if(filed.mkdir()){ System.out.println("directory is created"); }} else{ System.out.println("directory exist");  }

    File filel = new File("C:\\dir1\\dir2");
    if(!filel.exists()){  if(filel.mkdir()){ System.out.println("directory is created");   }} else{ System.out.println("directory exist");  }

    File filet = new File("C:\\dir1\\dir2\\dir3");
    if(!filet.exists()){  if(filet.mkdir()){ System.out.println("directory is  created"); }}  else{ System.out.println("directory exist");  }
Stefano Castagnino
quelle
0

Mit dieser Funktion können Sie ein Verzeichnis im Basisverzeichnis des Benutzers erstellen.

private static void createDirectory(final String directoryName) {
    final File homeDirectory = new File(System.getProperty("user.home"));
    final File newDirectory = new File(homeDirectory, directoryName);
    if(!newDirectory.exists()) {
        boolean result = newDirectory.mkdir();

        if(result) {
            System.out.println("The directory is created !");
        }
    } else {
        System.out.println("The directory already exist");
    }
}
Boubakr
quelle
Wie in dem Kommentar von @mwhs zu Jigar Joshis Antwort erwähnt, ist es nicht nur nicht notwendig, zuerst auf Existenz zu prüfen, sondern auch eine schlechte Idee.
Bdoserror
0

Wenn Sie sicher sein möchten, dass es erstellt wurde, dann ist dies:

final String path = "target/logs/";
final File logsDir = new File(path);
final boolean logsDirCreated = logsDir.mkdir();
if (!logsDirCreated) {
    final boolean logsDirExists = logsDir.exists();
    assertThat(logsDirExists).isTrue();
}

beacuse mkDir()gibt einen Booleschen Wert zurück und findbugs wird danach schreien, wenn Sie die Variable nicht verwenden. Auch ist es nicht schön ...

mkDir()gibt nur true zurück, wenn es mkDir()erstellt wird. Wenn das Verzeichnis vorhanden ist, wird false zurückgegeben. Um das von Ihnen erstellte Verzeichnis zu überprüfen, rufen Sie nur auf, exists()wenn mkDir()false zurückgegeben wird.

assertThat()prüft das Ergebnis und schlägt fehl, wenn exists()false zurückgegeben wird. ofc Sie können andere Dinge verwenden, um das nicht erstellte Verzeichnis zu behandeln.

l0wacska
quelle
-2
public class Test1 {
    public static void main(String[] args)
    {
       String path = System.getProperty("user.home");
       File dir=new File(path+"/new folder");
       if(dir.exists()){
           System.out.println("A folder with name 'new folder' is already exist in the path "+path);
       }else{
           dir.mkdir();
       }

    }
}
Fathah Rehman P.
quelle
Wie in dem Kommentar von @mwhs zu Jigar Joshis Antwort erwähnt, ist es nicht nur nicht notwendig, zuerst auf Existenz zu prüfen, sondern auch eine schlechte Idee.
Bdoserror
-7

Sie können auch auf die Funktion makdir () verweisen , um ein neues Verzeichnis in einem gewünschten Ordner zu erstellen.

arun
quelle
9
Es ist keine Methode benannt makdir. Wenn Sie gemeint haben mkdir, wie fügt dies etwas zu den vorhandenen Antworten hinzu?
Ted Hopp