Testen auf Existenz des Verzeichnisses

Wambui

Aktives Mitglied
Hallo,

ich habe mit einer IF-Abfrage ein Problem, dass mich verzweifelt. Dazu folgender Test-Code, mit dem ich versuche, mein Problem zu lösen:

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

public class TestRun {

    public static void main(String[] args) {
        String dir = "Test";
        String directory = System.getProperties().getProperty("user.home")+File.separator+dir;
        
        Path dirPath = Paths.get(directory); 
        if (!(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists())) {
            try {
                System.out.println(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists());
                System.out.println("Verzeichnis wird angelegt");
                dirPath = Files.createDirectory(dirPath);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists());
            System.out.println("Verzeichnis ist bereits angelegt");
        }
    }

}
Es soll zuerst geprüft werden, ob bereits ein bestimmtes Verzeichnis existiert. Und wenn es nicht existiert
Java:
if (!(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists())) {
dann lege das Verzeichnis an.
Gleichzeitig lasse ich mir den Boolean-Wert der Abfrage in beiden Fällen anzeigen, sowie einen erklärenden Text.
Wenn das Programm zum ersten Mal abläuft, dann erhalte ich
false
Verzeichnis wird angelegt
Die richtige Schleife wird ausgeführt.
Wenn ich das Programm ein zweites Mal aufführe, ohne das Verzeichnis "Test" zu löschen, bekomme ich anstelle von
true
Verzeichnis ist bereits angelegt
folgende Ausgabe mit stacktrace:
false
Verzeichnis wird angelegt
java.nio.file.FileAlreadyExistsException: /home/wambui/Test
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:88)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:383)
at java.nio.file.Files.createDirectory(Files.java:628)
at com.linuxmaker.calculator.TestRun.main(TestRun.java:20)

Ich verstehe nicht, warum die if-else-Schleife nicht richtig funktioniert.

Grüße
Wambiu
 
Zuletzt bearbeitet von einem Moderator:
if (!(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists())) {


lass das ! mal weg, was passiert dann ?

Normalerweise , dürfte wenn das Verzeichnis nicht existiert nicht true zurück gegeben werden.

Java:
	public Foo(){
		
		if(!new File("H:Schrott").exists()) {
			System.out.println("true");
		}
		else{
			System.out.println("false");
		}
	}
	
	public static void main(String[] args){
		new Foo();
	}
}

Der File existiert nicht und trotzdem wird true zurückgegeben, du musst das ! weglassen

sonst prüfst du folgendes

Code:
wenn Nicht ( verzeichnis nicht existiert){.....}

das führt dazu das !false = true geliefert wird sprich ein toggle like

Java:
boolean b;

public void toggle(){
   b = !b;
}
 
Zuletzt bearbeitet:
So wie ich das sehe kommst du bei der Verwendung von dir und directory durcheinander.

Schreib mal in Zeile 14 z.B. statt
Java:
if (!(new File(System.getProperties().getProperty("user.home")+File.separator+directory).exists())) {

einfach nur
Java:
 if (!(new File(directory).exists())) {

In Zeile 16 und 23 das gleiche..
 
Wenn du schon NIO.2 verwendest, dann bitte nicht mit IO mischen.

Verwende lieber die Files Klasse um zu überprüfen, ob ein Directory existiert oder nicht.

Dann sieht das in etwa so aus:

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

public class DirectoryExist {

  public static void main(String[] args) {
    String dir = "Test";
    Path dirPath = Paths.get(System.getProperties().getProperty("user.home"), dir);

    if (!Files.exists(dirPath)) {
      try {
        System.out.println(Files.exists(dirPath));
        System.out.println("Verzeichnis wird angelegt");
        dirPath = Files.createDirectory(dirPath);
      } catch (IOException e) {
        e.printStackTrace();
      }
    } else {
      System.out.println(Files.exists(dirPath));
      System.out.println("Verzeichnis ist bereits angelegt");
    }
  }
}

PS: if-Schleifen gibt es nicht. Nur if-Abfragen!
 
Zuletzt bearbeitet:
Besten Dank,

weitergeholfen hat mir der Hinweis von Flown mit der Benutzung von Files unter NIO.2. Das löst mein Problem, vor allem mit Files.noExists(Path, options), da ich die Abfrage nur durch laufen will, wenn das Verzeichnis nicht existiert. Der Else-Block war nur für mich, um zu sehen, was im anderen Fall passiert.

Apropos - falls das ein Moderator liest:
Ich fände es sehr praktikabel, wenn man hier im Forum Erledigt-Flags setzen könnte oder zumindest die Original-Überschrift bearbeiten könnte.


Grüße und besten Dank

Wambui
 

Zurück
Oben