¿Cómo verificar si existe un archivo o directorio?


131

Quiero verificar la existencia del archivo ./conf/app.ini en mi código Go, pero no puedo encontrar una buena manera de hacerlo.

Sé que hay un método de archivo en Java: public boolean exists() que devuelve verdadero si el archivo o directorio existe.

Pero, ¿cómo se puede hacer esto en Go?


77
También tenga en cuenta que dependiendo de cómo vaya a utilizar esta información, tiene una condición de carrera. Todo lo que puede decir es que hace poco el archivo existía / no existía; para cuando actúes en el examen, lo contrario puede ser cierto. Por lo general, es mucho mejor verificar mientras se realiza cualquier operación que se pretenda hacer (por ejemplo, no verificar antes de abrir un archivo existente o crear un nuevo archivo, pero hacer f, err := os.Open(name)o f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)luego verificar os.IsNotExist(err)).
Dave C

Respuestas:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Editado para agregar manejo de errores.


44
A mí me parece 'programación de excepción'. ¿Hay algún recurso que justifique este tipo de código como paradigma oficial #golang?
Olivier Amblet

21
@ OlivierAmblet No hay ninguna excepción aquí. Go utiliza panicpara una "excepción" real como objeto. Puede "atrapar" con una llamada a recover. Devolver explícitamente un errcomo segundo valor de retorno es una técnica de Go extremadamente común e idiomática. Ver: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
la solución no es muy sencilla, ir es especial
zhaozhi

1
Es cierto que no existe una función booleana Exists, pero el código de la aplicación puede ser más simple si solo desea verificar la existencia de un archivo:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
¿Por qué todo en este idioma es tan complicado?
Top Cat


22

Más para tu información, ya que miré a mi alrededor durante unos minutos pensando que mi pregunta sería una búsqueda rápida.

¿Cómo verificar si la ruta representa un directorio existente en Go?

Esta fue la respuesta más popular en mis resultados de búsqueda, pero aquí y en otros lugares las soluciones solo proporcionan verificación de existencia. Para verificar si pathrepresenta un directorio existente, descubrí que podría fácilmente:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Parte de mi problema era que esperaba que el path/filepathpaquete contuviera la función isDir ().



-2

Hay una manera simple de verificar si su archivo existe o no:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

Este es un duplicado de la respuesta de Denys Séguret.
StardustGogeta
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.