La biblioteca estándar de Go no tiene una función destinada únicamente a verificar si un archivo existe o no (como Python os.path.exists
). ¿Cuál es la forma idiomática de hacerlo?
file
go
standard-library
Sridhar Ratnakumar
fuente
fuente
Respuestas:
Para verificar si un archivo no existe, equivalente a Python
if not os.path.exists(filename)
:Para verificar si existe un archivo, equivalente al de Python
if os.path.exists(filename)
:Editado: por comentarios recientes
fuente
NOTEXIST
, por ejemplo, si/etc/bashrc
existe,/etc/bashrc/foobar
regresaráENOTDIR
!os.IsNotExist(err)
. Es posible que el archivo exista peroos.Stat
falle por otros motivos (por ejemplo, permiso, disco defectuoso). El usoerr == nil
como la condición clasifica incorrectamente errores tales como "el archivo no existe".Respuesta de Caleb Spare publicada en la lista de correo de gonuts .
Tomado de: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
fuente
Debe usar las funciones
os.Stat()
yos.IsNotExist()
como en el siguiente ejemplo:El ejemplo se extrae de aquí .
fuente
El ejemplo de user11617 es incorrecto; informará que el archivo existe incluso en los casos en que no existe, pero hubo un error de algún otro tipo.
La firma debe ser Exists (string) (bool, error). Y luego, como sucede, los sitios de llamadas no son mejores.
El código que escribió sería mejor como:
Pero sugiero esto en su lugar:
fuente
err != nil
lugar deerr == nil
? Si hay un error, ¿entonces el archivo probablemente no existe?Lo que otras respuestas perdieron es que la ruta dada a la función podría ser un directorio. La siguiente función se asegura de que la ruta sea realmente un archivo.
Otra cosa a destacar: este código aún podría conducir a una condición de carrera, donde otro subproceso o proceso elimina o crea el archivo especificado, mientras se ejecuta la función fileExists.
Si le preocupa esto, use un bloqueo en sus hilos, serialice el acceso a esta función o use un semáforo entre procesos si hay varias aplicaciones involucradas. Si hay otras aplicaciones involucradas, fuera de tu control, supongo que no tienes suerte.
fuente
fuente
El ejemplo de la función:
fuente
Veamos primero algunos aspectos, tanto la función proporcionada por el
os
paquete degolang
no son utilidades sino verificadores de errores, lo que quiero decir con eso es que son solo un contenedor para manejar errores en la plataforma cruzada.Básicamente, si
os.Stat
si esta función no produce ningún error, eso significa que el archivo existe si es necesario, debe verificar qué tipo de error es, aquí viene el uso de estas dos funcionesos.IsNotExist
yos.IsExist
.Esto puede entenderse como el
Stat
error de lanzamiento del archivo porque no existe o es un error de lanzamiento porque existe y hay algún problema con él.El parámetro que toman estas funciones es de tipo
error
, aunque es posible que pueda pasarlonil
, pero no tendría sentido.Esto también apunta al hecho de que
IsExist is not same as !IsNotExist
son dos cosas diferentes.Entonces, si desea saber si existe un archivo determinado en go, preferiría que la mejor manera sea:
fuente
Como se menciona en otras respuestas, es posible construir los comportamientos / errores requeridos a partir del uso de diferentes indicadores con
os.OpenFile
. De hecho,os.Create
es solo una abreviatura de valores razonables para hacerlo:Debe combinar estas banderas usted mismo para obtener el comportamiento que le interesa:
Dependiendo de lo que elija, obtendrá diferentes errores.
Aquí hay un ejemplo donde deseo abrir un archivo para escribir, pero solo truncaré un archivo existente si el usuario ha dicho que está bien:
fuente
La mejor manera de verificar si el archivo existe:
fuente