Como verificar se existe um arquivo ou diretório?


131

Quero verificar a existência de arquivo ./conf/app.inino meu código Go, mas não consigo encontrar uma boa maneira de fazer isso.

Eu sei que existe um método de arquivo em Java public boolean exists():, que retorna true se o arquivo ou diretório existir.

Mas como isso pode ser feito no Go?


7
Observe também que, dependendo de como você usar essas informações, você terá uma condição de corrida. Tudo o que você pode dizer é que, há pouco tempo, o arquivo não existia; no momento em que você atua no teste, o oposto pode ser verdadeiro. Normalmente, é muito melhor verificar enquanto faz qualquer operação que você pretenda fazer (por exemplo, não verifique antes de abrir um arquivo existente ou criar um novo arquivo, mas faça f, err := os.Open(name)ou f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)verifique os.IsNotExist(err)).
Dave C

Respostas:


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 adicionar tratamento de erros.


4
Parece 'programação de exceção' para mim. Existe algum recurso que justifique esse tipo de código como um paradigma oficial #golang?
Olivier Amblet

21
@OlivierAmblet Não há nenhuma exceção acontecendo aqui. Go usa panicpara uma "exceção" real como um objeto. Você pode "pegar" com uma chamada para recover. O retorno explícito de errum segundo valor é uma técnica Go idiomática extremamente comum. Veja: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
a solução não é muito straitforward, go é especial
zhaozhi

1
É verdade que não existe uma função booleana Exists, mas o código do aplicativo pode ser mais simples se você quiser apenas verificar a existência de um arquivo:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Por que tudo nesta linguagem é tão complicado?
Top Cat


22

Mais como um FYI, já que olhei em volta por alguns minutos, pensando que minha pergunta estava a uma rápida pesquisa.

Como verificar se o caminho representa um diretório existente no Go?

Essa foi a resposta mais popular nos meus resultados de pesquisa, mas aqui e em outros lugares as soluções fornecem apenas a verificação da existência. Para verificar se pathrepresenta um diretório existente, achei que poderia facilmente:

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

Parte do meu problema era que eu esperava que o path/filepathpacote contivesse a função isDir ().



-2

Existe uma maneira simples de verificar se o seu arquivo existe ou não:

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
    }
}

Esta é uma duplicata da resposta de Denys Séguret.
StardustGogeta
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.