2012-07-02 31 views
20
que

Si hago esto:Comprobar si existe el archivo sin crear

File f = new File("c:\\text.txt"); 

if (f.exists()) { 
    System.out.println("File exists"); 
} else { 
    System.out.println("File not found!"); 
} 

A continuación, el archivo se crea y siempre devuelve "Archivo existe". ¿Es posible verificar si un archivo existe sin crearlo?

EDIT:

Me olvidé de mencionar que está en un bucle. Así que aquí está la cosa real:

for (int i = 0; i < 10; i++) { 
    File file = new File("c:\\text" + i + ".txt"); 
    System.out.println("New file created: " + file.getPath()); 
} 
+0

posible duplicado de [¿Cómo puedo verificar si existe un archivo? (Java en Windows)] (http: // stackoverflow.com/questions/1816673/how-do-i-check-if-a-file-exists-java-on-windows) – MarcoS

+1

@MarcoS: en realidad no es un duplicado. El título de esta pregunta está simplemente mal redactado. –

+0

@JoachimSauer: tal vez no sea un duplicado exacto, pero la respuesta podría inferirse leyendo esa pregunta y probando un poco de código ... entonces para mí es un duplicado – MarcoS

Respuesta

46

Cuando crea un File, no está creando nada en el disco, sino simplemente creando un objeto sobre el que puede llamar a algunos métodos, como exists().

Eso está bien y es barato, no intente evitar esta instanciación.

La instancia File sólo tiene dos campos:

private String path; 
private transient int prefixLength; 

y aquí está el constructor:

237  public File(String pathname) { 
238   if (pathname == null) { 
239    throw new NullPointerException(); 
240   } 
241   this.path = fs.normalize(pathname); 
242   this.prefixLength = fs.prefixLength(this.path); 
243  } 

Como se puede ver, la instancia File es sólo una encapsulación de la ruta. Crearlo para llamar al exists() es la forma correcta de proceder. No trates de optimizarlo.

+5

@ThreaT: contrariamente a la opinión común, el código de ejecución dentro de un bucle ** no ** cambia fundamentalmente lo que hace el código. –

+1

@ThreaT si el 'nuevo código de archivo' está en un bucle, puede que sea culpable de una codificación ineficiente, pero aún así no creará un archivo real. Si su archivo existe, definitivamente no se debe a la clase Archivo. – mah

+0

@ThreaT No hay problema. En serio, eso es realmente barato. Eso no es más que una encapsulación de tu camino. –

10

Creación de una instancia File no crea un archivo en el sistema de archivos, por lo que el código publicado hará lo que usted requiere.

+0

@ThreaT, totalmente irrelevante. Para crear un archivo usando 'File' necesita invocar' File.createNewFile() '. – hmjd

+0

@ThreaT, ese bucle 'for' no creará archivos. Imprimirá el mensaje "Nuevo archivo creado ...." pero estos archivos no existirán en su sistema de archivos. Agregue 'file.exists()' a su mensaje y será 'false' (suponiendo que no existan actualmente). – hmjd

2

A partir de Java 7 puede utilizar java.nio.file.Files.exists:

Path p = Paths.get("C:\\Users\\first.last"); 
boolean exists = Files.exists(p); 
boolean notExists = Files.notExists(p); 

if (exists) { 
    System.out.println("File exists!"); 
} else if (notExists) { 
    System.out.println("File doesn't exist!"); 
} else { 
    System.out.println("File's status is unknown!"); 
} 

En el Oracle tutorial se pueden encontrar algunos detalles sobre este:

Los métodos de la clase Path son sintácticos, lo que significa que operan en la instancia Path. Pero, finalmente, debe acceder al sistema de archivos para verificar que existe un Path particular, o que no existe. Puede hacerlo con los métodos exists(Path, LinkOption...) y notExists(Path, LinkOption...). Tenga en cuenta que !Files.exists(path) no es equivalente a Files.notExists(path). Cuando está probando la existencia de un archivo, son posibles tres resultados:

  • Se ha verificado que el archivo existe.
  • Se ha verificado que el archivo no existe.
  • El estado del archivo es desconocido. Este resultado puede ocurrir cuando el programa no tiene acceso al archivo.

Si tanto exists y notExists retorno false, la existencia del archivo no puede ser verificada.

+0

Hola a casa Rumania :-) – Flavius