2010-01-28 19 views
5

Sono in esecuzione Windows e sto cercando di fare riferimento a una directory. La mia funzione inizia in questo modo:Come faccio a fare riferimento a una directory in Java?

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

ho ottenuto un NullPointerException all'interno della funzione doStuffWith, quando ho provato a chiamare listFiles. Bene, ho guardato in C: \ somedir e cosa ho trovato - c'è un file chiamato "report" senza estensione, e anche una directory chiamata "report"! Ciò che sembrava accadere era che l'oggetto si riferiva al file del report anziché alla directory . Come posso assicurarmi che mi riferisca alla directory e non al file?

+2

Hai provato File file = nuovo File ("C: \\ somedir \\ report \\"); (notare le barre finali). Non ho idea se funzioni, ma ne valga la pena una build e un test rapidi. – Paolo

+2

Che tipo di sistema operativo lo consente comunque? Ho avuto l'impressione che Windows non lo consenta. È possibile che la tua directory abbia alcuni caratteri invisibili nel nome (uno spazio, per esempio)? –

+0

Ho appena provato a creare una cartella denominata "Cartella" e un file senza estensione chiamato "Cartella" e Windows si è lamentato di ciò. Sto usando Windows XP SP3 a 32 bit. –

risposta

3

one way to go about è passare l'oggetto file corrispondente a "C: \ somedir" al metodo e all'interno del metodo, fare un listFiles() e camminare tra i contenuti, controllando ogni volta il nome del file e se è "report", fa una isDirectory(). procedi con l'elaborazione vera e propria quando questo ritorna vero.

+0

Sì, questa è sicuramente una soluzione al mio problema. Ma abbastanza inefficiente, qualcuno sa qualcosa di meglio? – Kidburla

+0

@Kidburla: ha funzionato? Se lo fa, allora puoi guardare i due oggetti File e vedere la differenza (nel peggiore dei casi potresti voler guardare con il riflesso). –

+0

@ Kiburla So che non è il miglior approccio ... questa è stata la prima cosa che mi è accaduta quando ho visto il problema ... e l'ho ritenuto degno di condivisione :-) – Aadith

3

Penso che ci sia un metodo isDirectory() che vi dirà se si tratta di una directory

--edit

questo è ciò che ho per essere così presto. Ho eseguito il codice in locale e funziona perfettamente per me. È stato in grado di creare nuovi file, leggere il contenuto della directory, ecc. Che altro stai cercando di fare?

+1

Sì, è ovvio ... Ma come faresti a gestire la ** directory effettiva **? Questo è il punto qui. – BalusC

+0

Sono d'accordo con BalusC sopra, questo non risponde alla mia domanda, mi dispiace ... – Kidburla

+0

Ancora una volta ho paura di aver letto male la mia domanda. Il codice funzionerà nella maggior parte dei casi, ma ero interessato al caso specifico in cui esiste un file senza estensione chiamato "report" nella directory "somedir". – Kidburla

1

Non capisco il problema questo funziona bene per me:

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

Ho paura di aver letto male la mia domanda. Il codice funzionerà nella maggior parte dei casi, ma ero interessato al caso specifico in cui esiste un file senza estensione chiamato "report" nella directory "somedir". – Kidburla

0

Verificare se il file di sistema ha attivato avuto la sensibilità caso

Se è così, si può (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive nel Registro di sistema.) essere morsi da un problema relativo al caso. Un modo per verificare:

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

Se entrambe le chiamate mkdirs() riuscito, sai di avere una complicazione caso relativo. Se è così, assicurati di avere esattamente il caso per "C:\somedir\report".

Problemi correlati