¿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?

hardPass
fuente
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.

Mostafa
fuente
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
123

Puedes usar esto:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Ver: http://golang.org/pkg/os/#IsNotExist

Denys Séguret
fuente
66
Esto es mejor que la respuesta aceptada, pero ¿es realmente necesaria la cláusula else?
Sergey Koulikov
9
@SergeyKoulikov Podría haber otros errores, como uno de permiso.
Denys Séguret
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 ().

Edward Wagner
fuente
-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
    }
}
Kabeer Shaikh
fuente
Este es un duplicado de la respuesta de Denys Séguret.
StardustGogeta