Go's biblioteca padrão não tem uma função destinada apenas a verificar se um ficheiro existe ou não (como Python's os.path.exist
). Qual é a idiomatic forma de o fazer?
Para verificar se um ficheiro não't existe, equivalente a Python's se não existir os.path.s(filename)
:
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
// path/to/whatever does not exist
}
Para verificar se um ficheiro existe, equivalente a Python's se os.path.s existir(filename)
:
Editado: por comentários recentes
if _, err := os.Stat("/path/to/whatever"); err == nil {
// path/to/whatever exists
} else if os.IsNotExist(err) {
// path/to/whatever does *not* exist
} else {
// Schrodinger: file may or may not exist. See err for details.
// Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence
}
Deve utilizar as funções os.Stat()
e os.IsNotExist()
como no exemplo seguinte:
// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
O exemplo é extraído de aqui.
O exemplo por utilizador11617 está incorrecto; irá reportar que o ficheiro existe mesmo nos casos em que não existe, mas houve um erro de qualquer outro tipo.
A assinatura deve ser Existente(string) (bool, erro). E depois, como acontece, os locais de chamada não são melhores.
O código que ele escreveu seria melhor como:
func Exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
Mas eu sugiro isto em vez disso:
func Exists(name string) (bool, error) {
_, err := os.Stat(name)
if os.IsNotExist(err) {
return false, nil
}
return err != nil, err
}