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?

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

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

Você pode usar isto:

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

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

Denys Séguret
fonte
6
Isso é melhor do que a resposta aceita, mas a cláusula else é realmente necessária?
Sergey Koulikov
9
@SergeyKoulikov Pode haver outros erros, como um de permissão.
Denys Séguret
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 ().

Edward Wagner
fonte
-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
    }
}
Kabeer Shaikh
fonte
Esta é uma duplicata da resposta de Denys Séguret.
StardustGogeta