2010-01-28 16 views
5

Estoy ejecutando Windows y estoy tratando de referirme a un directorio. Mi función comienza así:¿Cómo me refiero a un directorio en Java?

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

que tiene una NullPointerException dentro de la función doStuffWith, cuando traté de llamar listFiles. Bueno, miré en C: \ somedir y qué encontré - hay un archivo llamado "informe" sin extensión, y también un directorio llamado "informe"! Lo que parecía suceder era que el objeto file se estaba refiriendo al archivo de informe en lugar del directorio . ¿Cómo me aseguro de que me estoy refiriendo al directorio y no al archivo?

+2

¿Has probado File file = new File ("C: \\ somedir \\ report \\"); (tenga en cuenta las barras al final). No tengo idea de si eso funciona, pero vale la pena construirlo y probarlo rápidamente. – Paolo

+2

¿Qué tipo de sistema operativo permite esto de todos modos? Tenía la impresión de que Windows no permite esto. ¿Es posible que su directorio tenga algunos caracteres invisibles en el nombre (un espacio, por ejemplo)? –

+0

Acabo de intentar crear una carpeta llamada "Carpeta" y un archivo sin extensión llamado "Carpeta" y Windows se quejó de ello. Estoy ejecutando Windows XP SP3 de 32 bits. –

Respuesta

3

una forma de hacerlo es pasar el objeto de archivo correspondiente a "C: \ somedir" al método y dentro del método, hacer una lista de archivos() y recorrer los contenidos, cada vez que compruebe el nombre del archivo y si es "informe", haga un isDirectory(). proceda con el procesamiento real cuando esto se vuelva verdadero.

+0

Sí, esa es ciertamente una solución a mi problema. Pero bastante ineficiente, ¿alguien sabe algo mejor? – Kidburla

+0

@Kidburla: ¿esto realmente funcionó? Si lo hace, entonces podría mirar los dos objetos File y ver la diferencia (en el peor de los casos, es posible que desee ver con el reflejo). –

+0

@Kiburla Sé que no es el mejor enfoque ... esto fue la primera cosa que se me ocurrió cuando miré el problema ... y pensé que valía la pena compartirlo :-) – Aadith

3

Creo que hay un método isDirectory() que le dirá si se trata de un directorio

--edit

eso es lo que me pasa por ser tan temprano. Ejecuté tu código localmente y funciona bien para mí. Pudo crear nuevos archivos, leer el contenido del directorio, etc. ¿Qué más estás tratando de hacer?

+1

Sí, eso es obvio ... ¿Pero cómo conseguirías alguna vez manejar el ** directorio real **? Ese es el punto aquí. – BalusC

+0

Estoy de acuerdo con BalusC anterior, esto no responde mi pregunta, lo siento ... – Kidburla

+0

De nuevo, me temo que ha leído mal mi pregunta. El código funcionará en la mayoría de los casos, pero me interesó el caso específico donde hay un archivo sin extensión llamado "informe" en el directorio "somedir". – Kidburla

1

No entiendo el problema que esto funciona bien para mí:

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

Me temo que has leído mal mi pregunta. El código funcionará en la mayoría de los casos, pero me interesó el caso específico donde hay un archivo sin extensión llamado "informe" en el directorio "somedir". – Kidburla

0

Compruebe si su sistema de archivos ha permitido a mayúsculas y minúsculas tenido

Si es así, puede (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive en el registro.) ser mordido por un problema relacionado con el caso. Una forma de comprobar:

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

Si ambas llamadas mkdirs() tuvieron éxito, usted sabe que tiene una complicación relacionada con el caso. Si es así, asegúrese de obtener el caso para "C:\somedir\report" exactamente correcto.

Cuestiones relacionadas