# Files.isDirectory



## blackwater (3. Aug 2012)

hey leute. 
mein problem ist, dass mir die funktion .isDirectory() in jedem fall false liefert, ganz gleich ob es sich um eine datei oder um ein verzeichnis handelt. 
habt ihr irgendwelche ideen, wieso das so ist/was ich dagegen tun kann?

meine saftware: win7 enterprise 32bit mit jdk7.5


danke und mfg

edit: bei der funktion isFile() ist es genau das gleiche...


----------



## maki (3. Aug 2012)

Um welches Verzeichnis handelt es sich denn genau?


----------



## blackwater (3. Aug 2012)

um stinknormale, simple ordner, 
die in einem stinknormalen, simplen ordner liegen


----------



## Flown (3. Aug 2012)

Wie sieht denn dein Code aus?


----------



## blackwater (3. Aug 2012)

```
public class Lister {

  private static List<File> files = new ArrayList<>();

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    File f = new File("D:\\Data\\lenzma\\Eigene Dateien\\kw31\\Schulungen");
    File f2 = new File("C:\\Users\\lenzma\\Desktop\\test");
    fillList(f);
    System.out.println(files.size());
    for(File h : files) {
      //System.out.println(h.getName());
    }
  }

  private static void fillList(File directory) {
    String[] helplist = directory.list();
    File[] list = new File[helplist.length];
    for (int i = 0; i < helplist.length; i++) {
      list[i] = new File(helplist[i]);
    }
    for (File h : list) {
      if (h.isDirectory()) {
        fillList(h);
      } else {
        files.add(h);
      }
    }
  }
}
```

neue erkenntnise: in f2 funktioniert der ganze käse...

und als erklärung: ich will eine datei haben, in der eine liste mit allen files steht, nicht aber den verzeichnissen


----------



## turtle (3. Aug 2012)

Schau Dir bitte die Methode

```
File.list(FilenameFilter filter)
```
und dabei natürlich die Klasse FilenameFilter ;-)


----------



## nillehammer (3. Aug 2012)

> und als erklärung: ich will eine datei haben, in der eine liste mit allen files steht, nicht aber den verzeichnissen


Da eignet sich Files.listFile mit einem entsprechenden FileFilter besser als die anderen Methoden, ungefähr so:

```
public static void main(String[] args) throws Exception {

    File currentDir = new File("./");
    
    FileFilter justFilesNoDirs = new FileFilter() {
      
      @Override
      public boolean accept(File file) {
      
        return file.isFile();
      }
    };
    
    File[] subFiles = currentDir.listFiles(justFilesNoDirs);

    System.out.println(Arrays.toString(subFiles));
  }
```


----------



## SlaterB (3. Aug 2012)

Leute, wenn in normaler Benutzung isFile(), isDirectory() nicht geht, dann auch kaum mit einem FileFilter,
der ist nicht magisch sondern ruft letztlich auch diese Methoden auf,

"D:\\Data\\lenzma\\Eigene Dateien\\kw31\\Schulungen"
mag schuld sein, kein Java-Programm muss was mit 'Eigene Dateien' zu tun haben,
ist es vorerst zu viel verlangt, die Daten in eigenene Verzeichnisse ohne evtl. Windows-Nutzer-Rechte-Zugriff und ganz besonders ohne Leerzeichen abzulegen?


----------



## Flown (3. Aug 2012)

```
File f = new File("D:\\Data\\lenzma\\Eigene Dateien\\kw31\\Schulungen");
    File f2 = new File("C:\\Users\\lenzma\\Desktop\\test");
```

da anscheinend f2 existiert probier doch auch mal als Testausgabe:


```
if(f.exists()) {
    System.out.println("Existiert");
}
else {
    System.out.println("Fehler im Pfad");
}
```


----------



## gasssssst (4. Aug 2012)

isDirectory liefert false, weil die zu überprüfende Datei nicht existiert.
Die Datei existiert nicht, weil RTFM zu Files#list(), oder lass dir den Pfad zu deiner zu überprüfenden Datei ausgeben.


----------



## blackwater (6. Aug 2012)

also erst mal danke für die vielen antworten! bin erst heute wieder im büro und drum meld ich mich erst jetzt ^^

ich hab eure tipps ausprobiert, leider half keiner ???:L 
was ich noch probiert hab ist, dass ich den gesammten ordner auf den desktop gezogen hab, weil ich da mit den rechten sicher keine probs haben sollte.. half auch nix...

ich hab jetzt eine lösung mit der annahme, dass in jedem file ein punkt vorkommt und in einem verzeichnis nicht, geschrieben. zwar etwas unsauber aber es funktioniert 

für interessierte: 

```
public static void main(String[] args) {
    File f = new File("C:\\Users\\lenzma\\Desktop\\Schulungen");
    fillList(f);
    
    for(File h : files) {
      System.out.println(h.getName());
    }
    System.out.println("\nAnz der Files: " + files.size());
  }

  private static void fillList(File directory) {
    String[] helplist = directory.list();
    File[] list = new File[helplist.length];
    for (int i = 0; i < helplist.length; i++) {
      list[i] = new File(helplist[i]);
    }
    for (File h : list) {
      if(h.getName().contains(".")) {
        files.add(h);
      } else {
        fillList(new File(directory.getAbsolutePath() + "\\" + h.getName()));
      }
    }
  }
```

danke nochmals und mfg


----------



## SlaterB (6. Aug 2012)

ist 
> fillList(new File(directory.getAbsolutePath() + "\\" + h.getName()));
ein Unterschied zu
> fillList(h);
?
(*)

statt deiner helplist gibts auch die Methode listFiles() in File,
ansonsten ginge auch alles in einer statt zwei Schleifen

einen Grund für isDirectory() mag ich aber nicht erkennen, 
zumal es ja immer noch in einem Verzeichnis geht, im anderen nicht?

edit:
halt, ist doch der Grund:


> public String[] list()
> [..]
> Otherwise an array of strings is returned, one for each file or directory in the directory. Names denoting the directory itself and the directory's parent directory are not included in the result. Each string is a file name rather than a complete path.
> [..]


nur mit den Dateinamen File-Objekte erstellt beziehen sich auf das aktuelle Verzeichnis,
funktioniert höchstens dort, sonst nirgendwo,

war etwa das Projektverzeichnis dein Referenztest?..


zu (*) ganz oben: wenn du schon erkannt hast, dass h kaputt ist, auch für die Rekursion,
wenn du sowieso schon neue File-Objekte erstellst,
dann könntest du doch gleich 'richtige' File-Objekte bauen und da dann natürlich auch isDirectory() usw. prüfen, das ist doch naheliegend


----------



## Gasssssssssssst (7. Aug 2012)

SlaterB hat gesagt.:


> ...
> "D:\\Data\\lenzma\\Eigene Dateien\\kw31\\Schulungen"
> mag schuld sein, kein Java-Programm muss was mit 'Eigene Dateien' zu tun haben,
> ...



Diese Aussage müsstest Du mir mal näher erklären. Warum sollte ein Java-Programm,
Benutzer spezifische Daten nicht im BenutzerOrdner ablegen? Mal abgesehen davon, 
dass man in dem Fall keinen absoluten Pfad benutzen sollte.

VG R


----------



## SlaterB (7. Aug 2012)

meine beiden Punkte dazu hatte ich dahinter geschrieben
- Leerzeichen im Pfad, mag bei File nicht stören, aber evtl. wenn eine Umgebungsvariable anzulegen ist, Programmargument, Process-Parameter usw.,
- Windows-Nutzer-Rechte-Zugriff, für den eigenen User dort vielleicht am ehesten, und c:/temp stattdessen gesperrt, 
aber lieber ganz außen vor lassen, etwa für andere angemeldete User nicht einsehbar und ähnlich schlimme Scherze, 
unter Linux wird das freilich nicht einfacher.., 
aber dann darf man zurecht als fortgeschritten genug gelten, um damit umgehen zu können, Windows ist der Dummy-Einstieg


----------



## pappawinni (7. Aug 2012)

Also ich denk mal,
da würd ich doch mal zu einer Datei in dem fraglichen Ordner navigieren und bei einem File, das in dem Ordner liegt mit der rechten Maustaste draufklicken und die Eigenschaften anzeigen lassen.
Da guckst du.. steht der Pfad und der sieht vielleicht anders aus, als du dachtest.

[EDIT]
Im übrigen frag ich mich warum die Backslashes so beliebt sind. Slash..
C:/Data/....
sollte es auch tun.
[/EDIT]


----------

