2010-06-05 19 views
7

Cuando paso File file a un método que estoy tratando de obtener su ruta completa como file.getAbsolutePath(); siempre obtengo el mismo resultado, no importa cuál use la ruta absoluta o canónica PATH_TO_MY_WORKSPACE/projectName/filename y no está allí , ¿cómo puedo obtener la ubicación exacta del archivo?Obtener ruta de archivo completa en java

Gracias

DETALLES:

Aquí hay un código y esta solución (su mala pero su trabajo):

private static void doSomethingToDirectory(File factDir) throws IOException { 
      File[] dirContents = factDir.listFiles(); 

      if(factDir.isDirectory() && dirContents.length > 0){ 
       for (int i = 0; i < dirContents.length; i++) { 
        for (String str : dirContents[i].list()) { 
         if(str.equals(TEMP_COMPARE_FILE)){ 
          process(new File(dirContents[i].getAbsolutePath() + "\\" + str)); 
         } 
        } 
       }   
      } 
     } 

estoy bucle directorios valle donde factDir es src/main , Busco archivos de BeProcessed.txt solo que es el valor de TEMP_COMPARE_FILE y los envío al método de proceso que lee el archivo y lo procesa.

Si alguien pudiera solución mejor Estaría agradecido

+1

¿Estás segura que no está allí? ¿has actualizado el árbol de archivos? (si usa eclipse;)) – RoflcoptrException

+0

¿Cómo se creó ese objeto de archivo? –

+0

@Sebi seguro que sí, @Peter sí lo hice :) – ant

Respuesta

13

Esta cita del Javadoc podría ser útil:

Un nombre de ruta, ya sea abstracto o en forma de cadena, puede ser absoluta o relativo. Se completa una ruta absoluta en que no se requiere ninguna otra información para localizar el archivo que denota. Un camino relativo, por el contrario, debe interpretarse en términos de información tomada de algún otro nombre de ruta. De forma predeterminada, las clases en el paquete java.io siempre resuelven las rutas relativas contra el directorio de usuario actual. Este directorio es nombrado por la propiedad del sistema user.dir, y es típicamente el directorio en el que se invocó la máquina virtual Java.

que interpretan de manera que si se crea el objeto File con new File("filename") donde filename es una ruta relativa, ese camino no se puede convertir en una ruta absoluta, incluso por una llamada a file.getAbsolutePath().

Actualización: ahora que usted envió código, se puede pensar en algunas formas de mejorarlo:

  • Se puede usar un FilenameFilter para encontrar los archivos deseados,
  • nota que list y listFiles retorno null para objetos que no sean de directorio, por lo que necesitamos una verificación adicional para eso,
  • también podría usar listFiles() nuevamente en el bucle interno, evitando así la necesidad de crear nuevos objetos File w con caminos ensamblados a mano. (Por cierto, tenga en cuenta que agregar \\ manualmente a la ruta no es portátil; la forma correcta sería usar File.separator).

El resultado final es

private static void doSomethingToDirectory(File factDir) throws IOException { 
    if (factDir.isDirectory()) { 
    for (File file : factDir.listFiles()) { 
     if (file.isDirectory()) { 
     for (File child : file.listFiles(new MyFilter())) { 
      process(child); 
     } 
     } 
    }   
    } 
} 

class MyFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
    return name.equals(TEMP_COMPARE_FILE); 
    } 
} 

notar que este código imita el comportamiento de la pieza original de código tanto como yo lo entendía; lo más notable es que encuentra los archivos con el nombre propio solo en los subdirectorios directos de factDir, no recursivamente.

+2

w0w Peter, definitivamente debo decir esto, creo que esta es una de las mejores respuestas que he tenido en mi vida, tu sugerencia de clase de MyFilter se redujo como código, simplemente INCREÍBLE. Muchas gracias – ant

2

Creo que hay una manera en que puede ayudarlo si y solo si el archivo está en el directorio del programa.

En primer lugar aparecerá el directorio del programa por:

new File(".").getCanonicalPath() 

a continuación:

si file está dentro de un directorio específico como folder\\filename la ruta completa habrá

(new File(".").getCanonicalPath() + "\\folder\\filename") 

o si file está directamente dentro del directorio del programa: la ruta completa wi ll ser

(new File(".").getCanonicalPath() + "\\filename") 

Deseo que esta respuesta ayuda ti :)

Cuestiones relacionadas