2012-05-09 36 views
84

Quiero verificar la existencia del archivo ./conf/app.ini en mi código de Golang. Pero no puedo encontrar una buena manera de hacerlo.¿Cómo comprobar si existe un archivo o directorio denotado por una ruta en Golang?

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 hacerlo en Golang?

+0

¿Estás inventando otro analizador ini para Go? Si es así, entonces deje de perder su tiempo y eche un vistazo a https://github.com/vharitonsky/iniflags :) – valyala

+4

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 tiempo el archivo sí/no existió; para el momento en que actúes en la prueba, lo opuesto puede ser cierto. Por lo general, es mucho mejor comprobarlo mientras se realiza la operación que pretendes hacer (por ejemplo, no verificar antes de abrir un archivo existente o crear uno nuevo, sino hacer 'f, err: = os.Open (name)' o 'f, err: = os.OpenFile (name, os.O_CREATE | os.O_EXCL, mode) 'y luego verifique' os.IsNotExist (err) '). –

Respuesta

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

editar para agregar el control de errores.

+4

Parece una 'programación de excepción' para mí. ¿Hay algún recurso que justifique este tipo de código como un paradigma oficial de #golang? –

+0

@OlivierAmblet Perdón por la respuesta tardía. ¿Qué quieres decir con "este tipo de código"? ¿Buscando 'err' o qué? – Mostafa

+16

@OlivierAmblet No hay excepción aquí. Ir utiliza 'panic' para una verdadera" excepción "como objeto. Puede "atrapar" con una llamada a 'recuperar'.Devolver explícitamente un 'err' como un segundo valor de retorno es una técnica de Go muy idiomática y muy común. Consulte: http://golang.org/doc/effective_go.html#errors – Crisfole

90

Puede utilizar esta:

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

+3

Esto es mejor que la respuesta aceptada, pero ¿es realmente necesaria la cláusula else? –

+6

@SergeyKoulikov Puede haber otros errores, como uno de permiso. –

+1

@SergeyKoulikov La manera correcta de mostrar su agradecimiento por una respuesta es con un voto ascendente. Si las personas están de acuerdo con usted en que esta respuesta es "mejor", eventualmente llegará a la cima y (probablemente) se convertirá en la respuesta aceptada. – Alex

8

Más de un FYI, ya que miré alrededor por unos minutos pensando que mi pregunta sería una búsqueda rápida de distancia.

¿Cómo comprobar si path representa un directorio existente en Go?

Esta fue la respuesta más popular en mis resultados de búsqueda, pero aquí y en otras partes las soluciones solo proporcionan comprobación de existencia. Para comprobar si path representa un directorio existente, descubrí que podí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 yo esperaba path/filepath paquete para contener la función isdir().

0

hay forma sencilla de comprobar si existe el archivo 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 
    } 
} 
Cuestiones relacionadas