Me he encontrado con un error que parece que no puedo encontrar ninguna lógica detrás. Tengo este objeto File, que se crea así:
File file = new File("utilities/data/someTextFile.txt");
Entonces lo hago file.exists()
, y vuelve false
(!?). Si no se encuentra el archivo, estoy ingresando f.getAbsolutePath()
a un archivo. Cuando miro el camino, parece estar bien. Puedo copiar y pegar la ruta completa en la ventana "Ejecutar" en Windows y el archivo se abre bien.
El archivo existe en todo momento y no se elimina ni se modifica durante la ejecución de mi aplicación. Se encuentra en la máquina local.
Esto solo parece ocurrir en determinadas situaciones. Puedo reproducir el error en cualquier momento, pero estoy seguro de que las acciones que realizo para reproducir el error no modifican la ruta del objeto de archivo.
¿Qué puede causar file.exists()
que se devuelva falso? ¿Tiene esto algo que ver con permisos o bloqueos de archivos, etc.?
Respuestas:
Veo la siguiente situación en Windows 7:
El archivo en cuestión es "var \ log", la ruta absoluta se refiere a un archivo existente que está en un subdirectorio normal (no en una tienda virtual). Esto se ve desde el IDE.
fuente
Parece que hay una diferencia en cómo se especifica la ruta en Java.
Por ejemplo, si la ruta del archivo se especifica como
file:/C:/DEV/test.txt
entoncesvolverá
false
. La ruta puede funcionar en el explorador o en el navegador, pero es una URL y no una ruta de archivo absoluta.Pero, por otro lado, si la ruta del archivo se especifica como
C:/DEV/test.txt
entoncesvolverá
true
porque la ruta no es una URL, pero es una ruta absoluta.Con Spring Framework eso es exactamente lo que
ResourceUtils.getFile(filename)
hace, donde el nombre puede ser una URL o la ruta absoluta del archivo.fuente
file:/C:/DEV/test.txt
trabajar como nombre de ruta. Es una URL, no un nombre de ruta. Si bien algunas personas cometen este error, no hay evidencia de que el OP haya ...Si el proceso no tiene permisos para saber si un archivo existe, devolverá falso. Puede que sea posible abrir un archivo, pero no saber con los métodos normales si existe.
fuente
Las respuestas anteriores no ayudaron en mi caso. Como se indicó anteriormente, tuve:
La causa principal de esto fue que el propietario de la máquina con Windows 7 había modificado el registro de CMD para que ejecutara automáticamente un comando para iniciarlo en un directorio específico para trabajar con Python. Esta modificación paralizó el código Java 1.6 que aparentemente usa CMD en Windows para ciertas operaciones de archivos, como
exists()
. La eliminación de la ejecución automática del registro resolvió el problema.fuente
()
faltan en la segunda línea despuésexists
; )Obviamente, hay una serie de posibles causas y las respuestas anteriores las documentan bien, pero así es como resolví esto en un caso particular:
Un estudiante mío tuvo este problema y casi me arranco el cabello tratando de resolverlo. Resultó que el archivo no existía, aunque parecía que sí. El problema era que Windows 7 estaba configurado para "Ocultar extensiones de archivo para tipos de archivo conocidos". Esto significa que si el archivo parece tener el nombre "data.txt", su nombre de archivo real es "data.txt.txt".
Espero que esto ayude a otros a salvarse un poco de cabello.
fuente
El
new File
comando simplemente crea una instancia de un archivo usando el nombre de ruta dado. En realidad, no crea un archivo en el disco duro.Si usted dice
Esto puede devolver verdadero solo si había un archivo existente con la misma ruta. Si pretendía comprobar el mismo archivo declarado en la primera línea, es posible que deba utilizarlo de esta forma.
Ahora esto volverá a ser verdad.
fuente
Si no quiere lidiar con las llamadas getAbsoluteFile () cada vez que tiene que llamar a un método, es mejor que cree su instancia de archivo ya con una ruta absoluta. Esto debería funcionar:
Sugiero rodearlo con un bloque try-catch, por cierto.
fuente
Para generalizar el problema, surge el problema al convertir URL / URI en rutas locales.
Espero que esto ayude.
fuente
Cuando se marca ["Ocultar extensiones para tipos de archivo conocidos."], Las ventanas abren "t.txt.txt" cuando se escribe "t.txt" en [explorador] / [ejecutar Windows] pero no mediante programación.
fuente
Buenas respuestas a todos. Descubrí que esto parece ser un problema con el acceso de Java al
C:
directorio raíz en Windows. Cualquier otro directorio debe estar bien, pero por alguna razón, mencionando específicamenteC:\
oC:
oC:/
podría dar un error. He resuelto este problema muy similar interceptando la menciónnew File("C:");
y reemplazándolo con nuevoFile(System.getProperty("file.separator"));
o debería poder codificar "\" en lugar de decir "c:" como su directorio de archivos y podría funcionar. No es elegante, pero hizo el trabajo por mí en este proyecto.Espero que ayude. Puede que no sea la solución correcta, pero al menos funcionó para mí. Estoy en
JRE 1.6, Win 7
. ¡Salud!Respetuosamente,
@ Carpintero1010
fuente
Si las situaciones en las que falla implica ejecutarlo como otro usuario, y estás en Windows Vista / Windows 7, podría ser causado por VirtualStore, el mecanismo en el que Windows permite que un usuario sin privilegios "escriba" lugares en los que normalmente no puede. Sin embargo, los cambios se almacenan en "% USERPROFILE% \ AppData \ Local \ VirtualStore \", que son privados para cada cuenta de usuario.
fuente
Cuando nada de arriba funcionó para mí, lo intenté
Esto limpiará su cuerda de cualquier carácter no deseado
fuente
Últimamente me encontré con este mismo problema. Lo que hice fue desinstalar Netbeans, eliminar la carpeta netbeans de la unidad C, archivos de programa, actualizar, programData, prácticamente en todas partes. Luego reinstale. Ahora está funcionando bien. No olvide hacer una copia de seguridad de la carpeta del proyecto netbeans antes de realizar las acciones anteriores.
Espero eso ayude.
fuente
Con algunos IDE (puede ser) y / o con algunos sistemas operativos (por ejemplo, ventana), de forma predeterminada no tienen acceso de escritura a los archivos. Entonces, si intentas hacer file.exists (), te mostrará falso. para solucionar este problema, haz lo siguiente
si su variable de referencia para Archivo es f, ejemplo: Archivo f = nuevo Archivo ("ruta");
así que para que funcione, seleccione f con el mouse y luego vaya al menú Buscar> Acceso de escritura> Espacio de trabajo. Ojalá funcione.
fuente
Creo que deberías usar barra invertida en su lugar, así:
Archivo archivo = nuevo archivo ("C: \\ Usuario \\ utilidades \\ datos \\ someTextFile.txt"); (dos barras invertidas, no un error tipográfico)
Debería resolver el problema :)
fuente