mkdirs() gibt false zurück

mkdirs() gibt false zurück

mkdirs() ist in Java eine Funktion, die einen Ordner samt aller Väterordner erstellt, wenn diese noch nicht existieren. Man kann dies mit dem Linuxkommando

mkdir -p /path/to/some/dir

vergleichen. Wie es sich herausgestellt hat, gibt diese Funktion ein false zurück, selbst wenn sie einen Ordner erfolgreich erstellt hat. Hier ein Java-Beispielcode:

import java.io.*;
public class MyFirstClass {
public static void main(String[] args) {

String folderName = "/home/jenkins/a/b";
try {

File folder = new File(folderName);
if(!folder.mkdirs()) {
System.out.println("Folders created!");
} else {
System.out.println("Failed to create folders!");
}

} catch (Exception e) {

System.err.println("Things went wrong: " + e.getMessage());
e.printStackTrace();

}
}
}

In diesem Programm wird ein Ordner namens /home/jenkins/a/b erstellt. Zu diesem Code habe ich noch ein Shell-Skript geschrieben, dass mir bei jedem Aufruf den Ordner /home/jenkins/a löscht, den Code kompiliert und das Programm startet (build.sh):

 !/bin/sh
if [ -d "/home/jenkins/a" ]; then
rm -rvf /home/jenkins/a
fi
rm -vf *.class
javac MyFirstClass.java
if [ -f "MyFirstClass.class" ]; then
java MyFirstClass
fi

Bei jedem Aufruf dieses Skripts wurde am Ende der Ordner /home/jenkins/a/b erstellt, jedoch kam bei jedem Durchlauf die Meldung Failed to create folders!.

Hintergrund ist der: Die Funktion mkdirs() gibt nur dann ein true zurück, wenn alle Ordner in der Ordnerstruktur neu erstellt werden. Wenn Teile davon schon vorher existiert haben, dann gibt die Funktion ein false zurück. Dazu die Doku:

Returns:
true if and only if the directory was created, along with all necessary parent directories; false otherwise

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html#mkdirs()

Ähnliches findet sich auch in einem Bugreport für OpenJDK von vor ziemlich langer Zeit:

File.mkdir() will return false if the target exists. File.mkdirs() will return false if any directory in the path was not created (e.g., it already existed) which will usually be the case. But a programmer has the facilities to see if a directory exists (File.exists()) which yes, probably will be of more interest in most cases.

https://bugs.openjdk.java.net/browse/JDK-1241581

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert