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.
newFile("/path/directory").mkdirs();
Veraltet:
File theDir =newFile("new folder");// if the directory does not exist, create itif(!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");}}
-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
newFile("/path/directory").mkdirs();
Hier ist "Verzeichnis" der Name des Verzeichnisses, das Sie erstellen / existieren möchten.
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.
@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
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
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.
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.
publicstaticvoid makeDir(){File directory =newFile(" 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");}}}
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;publicclassRevCreateDirectory{publicvoid revCreateDirectory(){//To create single directory/folderFile file =newFile("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/foldersFile files =newFile("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!");}}}}
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:
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 =newFile("C:\\dir1");if(!filed.exists()){if(filed.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filel =newFile("C:\\dir1\\dir2");if(!filel.exists()){if(filel.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filet =newFile("C:\\dir1\\dir2\\dir3");if(!filet.exists()){if(filet.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}
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:
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.
publicclassTest1{publicstaticvoid main(String[] args){String path =System.getProperty("user.home");File dir=newFile(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();}}}
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.
mkdir
ist in Java idempotent. Die Implementierung überprüft, ob das Verzeichnis für Sie vorhanden ist, und erstellt es nur, wenn es nicht vorhanden ist.Antworten:
Nach ~ 7 Jahren werde ich es auf einen besseren Ansatz aktualisieren, der von Bozho vorgeschlagen wird.
Veraltet:
quelle
if(!theDir.exists())
undtheDir.mkdir()
der Status geändert haben könnte, sowie es zwischendurch ändern könnte nicht Erstellen des Verzeichnisses (wegen derexists
Rückkehrtrue
) und benötigen es. Das Ergebnis der Methodeexists
sollte niemals verwendet werden, um zu entscheiden, ob ein Verzeichnis erstellt werden soll oder nicht. Rufen Sie einfach anmkdir
, es wird keine Ausnahme ausgelöst, wenn sie bereits vorhanden ist.mkdir
und Benötigen des Verzeichnisses ändern ? Ich nehme an, Sie haben gemeint, dass ein anderer Prozess das Verzeichnis löscht.mkdirs
Implementierung aus dem Quellcode ansehen , wird als erstes aufgerufenif (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.Files
wie in der neueren Antwort von Benoit Blanchon verwenden. (Diese Antwort scheint vor Java 7 geschrieben worden zu sein.)Hier ist "Verzeichnis" der Name des Verzeichnisses, das Sie erstellen / existieren möchten.
quelle
what if the directory is already exists? It would do overwriting? or skip the process.
Frage ergänzt werden.Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Mit Java 7 können Sie verwenden
Files.createDirectories()
.Zum Beispiel:
quelle
Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
directory.toPath()
.Sie können FileUtils # forceMkdir ausprobieren
Diese Bibliothek hat viele nützliche Funktionen.
quelle
mkdir vs mkdirs
Wenn Sie ein einzelnes Verzeichnis erstellen möchten, verwenden Sie
mkdir
Wenn Sie eine Hierarchie der Ordnerstruktur erstellen möchten, verwenden Sie
mkdirs
quelle
Erstellen Sie ein einzelnes Verzeichnis.
Erstellen Sie zusammen ein Verzeichnis mit dem Namen "Directory2" und alle Unterverzeichnisse "Sub2" und "Sub-Sub2".
Quelle: In diesem perfekten Tutorial finden Sie auch ein Anwendungsbeispiel.
quelle
Für Java 7 und höher:
Es scheint unnötig, vor dem Erstellen von createDirectories-Javadocs zu überprüfen, ob das Verzeichnis oder die Datei vorhanden ist :
quelle
Die folgende Methode sollte das tun, was Sie wollen. Stellen Sie nur sicher, dass Sie den Rückgabewert von mkdir () / mkdirs () überprüfen.
quelle
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.
quelle
Ordentlich und sauber:
quelle
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.
Und
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/
quelle
Ich wollte nur alle anrufen , die anrufen,
File.mkdir()
oderFile.mkdirs()
darauf achten, dass dasFile
Objekt ein Verzeichnis und keine Datei ist. Wenn Sie beispielsweisemkdirs()
den Pfad aufrufen/dir1/dir2/file.txt
, wird ein Ordner mit dem Namen erstellt,file.txt
der wahrscheinlich nicht Ihren Wünschen entspricht. Wenn Sie eine neue Datei erstellen und automatisch übergeordnete Ordner erstellen möchten, können Sie Folgendes tun:quelle
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. * /
quelle
Mit dieser Funktion können Sie ein Verzeichnis im Basisverzeichnis des Benutzers erstellen.
quelle
Wenn Sie sicher sein möchten, dass es erstellt wurde, dann ist dies:
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 esmkDir()
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()
wennmkDir()
false zurückgegeben wird.assertThat()
prüft das Ergebnis und schlägt fehl, wennexists()
false zurückgegeben wird. ofc Sie können andere Dinge verwenden, um das nicht erstellte Verzeichnis zu behandeln.quelle
quelle
Sie können auch auf die Funktion makdir () verweisen , um ein neues Verzeichnis in einem gewünschten Ordner zu erstellen.
quelle
makdir
. Wenn Sie gemeint habenmkdir
, wie fügt dies etwas zu den vorhandenen Antworten hinzu?