2010-01-28 11 views
5

Ich verwende Windows und versuche, auf ein Verzeichnis zu verweisen. Meine Funktion startet wie folgt aus:Wie beziehe ich mich auf ein Verzeichnis in Java?

File file = new File("C:\\somedir\\report"); 
if (!file.exists()) { 
    file.mkdirs(); 
} 
doStuffWith(file); 

Ich habe eine Nullpointer innerhalb der doStuffWith Funktion, als ich versuchte, listFiles zu nennen. Nun, ich schaute in C: \ somedir und was habe ich gefunden - es gibt eine Datei namens "report" ohne Erweiterung, und auch ein Verzeichnis namens "report"! Was zu geschehen schien, war, dass das Objekt file sich auf den Bericht Datei eher als Verzeichnis bezog. Wie stelle ich sicher, dass ich mich auf das Verzeichnis und nicht auf die Datei beziehe?

+2

Haben Sie versucht Datei Datei = neue Datei ("C: \\ somedir \\ Bericht \\"); (Beachten Sie die abschließenden Schrägstriche). Keine Ahnung ob das klappt aber einen schnellen Build und Test wert ist. – Paolo

+2

Welche Art von Betriebssystem erlaubt dies überhaupt? Ich hatte den Eindruck, dass Windows das nicht erlaubt. Ist es möglich, dass Ihr Verzeichnis einige unsichtbare Zeichen im Namen enthält (z. B. ein Leerzeichen)? –

+0

Ich habe gerade versucht, einen Ordner namens "Ordner" und eine Datei ohne Erweiterung namens "Ordner" zu erstellen und Windows beschwerte sich darüber. Ich verwende Windows XP SP3 32-Bit. –

Antwort

3

eine Möglichkeit ist, das Dateiobjekt entsprechend "C: \ somedir" an die Methode zu übergeben und innerhalb der Methode eine listFiles() auszuführen und durch den Inhalt zu gehen, jedes Mal nach dem Dateinamen und wenn es ist "report", mach ein isDirectory(). Fahren Sie mit der tatsächlichen Verarbeitung fort, wenn dies den Wert true zurückgibt.

+0

Ja, das ist sicherlich eine Lösung für mein Problem. Aber ziemlich ineffizient, weiß jemand etwas besser? – Kidburla

+0

@Kidburla: Hat das tatsächlich funktioniert? Wenn dies der Fall ist, können Sie sich die beiden Dateiobjekte ansehen und den Unterschied sehen (im schlimmsten Fall möchten Sie vielleicht mit Reflektion suchen). –

+0

@Kiburla Ich weiß, es ist nicht der beste Ansatz ... das war zufällig das erste, was mir passierte, als ich das Problem betrachtete ... und dachte, es wäre wert, geteilt zu werden :-) – Aadith

3

Ich glaube, es ein isDirectory ist() -Methode, die Ihnen sagen, wenn es ein Verzeichnis

--edit

ist, das ist, was ich für so früh sein werden. Ich habe deinen Code lokal ausgeführt und es funktioniert gut für mich. Konnte neue Dateien erstellen, Verzeichnisinhalte lesen usw. Was willst du sonst noch machen?

+1

Ja, das ist offensichtlich ... Aber wie würden Sie jemals das ** eigentliche Verzeichnis ** in den Griff bekommen? Das ist der springende Punkt hier. – BalusC

+0

Ich stimme mit BalusC oben überein, dies beantwortet meine Frage nicht, sorry ... – Kidburla

+0

Wieder habe ich Angst, dass Sie meine Frage falsch gelesen haben. Der Code wird in den meisten Fällen funktionieren, aber ich war an dem speziellen Fall interessiert, wo es eine erweiterungsfreie Datei namens "report" im Verzeichnis "somedir" gibt. – Kidburla

1

Ich verstehe nicht das Problem für mich gut funktioniert:

public class MkDir { 
    static void doStuff(File dir) { 
     if (dir.isDirectory()) { 
      File[] listFiles = dir.listFiles(); 
      for (File f : listFiles) { 
       System.out.println(f.getName()); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     File file = new File("C:\\dev\\rep2\\rep"); 
     if (!file.exists()) { 
      file.mkdirs(); 
     } 
     doStuff(file); 
    } 
} 
+0

Ich fürchte, du hast meine Frage falsch verstanden. Der Code wird in den meisten Fällen funktionieren, aber ich war an dem speziellen Fall interessiert, wo es eine erweiterungsfreie Datei namens "report" im Verzeichnis "somedir" gibt. – Kidburla

0

Überprüfen Sie, ob Ihr Dateisystem hatte Groß- und Kleinschreibung aktiviert

Wenn ja, können Sie (in der Registrierung HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive.) durch ein fallbezogenes Problem gebissen werden. Eine Möglichkeit, zu überprüfen:

String someName = "./nameNotUsedYet"; 
boolean first = new File(someName).mkdirs(); 
boolean second = new File(someName.toUpperCase()).mkdirs(); 
System.out.println("first = " + first + ", second = " + second); 

Wenn beide mkdirs() Anrufe erfolgreich war, Sie wissen, dass Sie einen Fall im Zusammenhang Komplikation haben. Wenn ja, stellen Sie sicher, dass Sie den Fall für "C:\somedir\report" genau richtig bekommen.

Verwandte Themen