A biblioteca padrão da Go não possui uma função destinada apenas a verificar se um arquivo existe ou não (como o Python os.path.exists
). Qual é a maneira idiomática de fazer isso?
file
go
standard-library
Sridhar Ratnakumar
fonte
fonte
Respostas:
Para verificar se um arquivo não existe, equivalente ao Python
if not os.path.exists(filename)
:Para verificar se existe um arquivo, equivalente ao do Python
if os.path.exists(filename)
:Editado: por comentários recentes
fonte
NOTEXIST
, por exemplo, se/etc/bashrc
existir, o/etc/bashrc/foobar
retornaráENOTDIR
!os.IsNotExist(err)
. É possível que o arquivo exista, masos.Stat
falhe por outros motivos (por exemplo, permissão, falha no disco). O usoerr == nil
como condição categoriza incorretamente falhas como "o arquivo não existe".Responder por Caleb Spare publicado na lista de discussão gonuts .
Retirado de: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
fonte
Você deve usar as funções
os.Stat()
eos.IsNotExist()
como no exemplo a seguir:O exemplo é extraído daqui .
fonte
O exemplo do usuário11617 está incorreto; relatará que o arquivo existe mesmo nos casos em que não existe, mas houve um erro de outro tipo.
A assinatura deve ser Existe (string) (bool, erro). E então, por acaso, os sites de chamadas não são melhores.
O código que ele escreveu seria melhor como:
Mas sugiro isso:
fonte
err != nil
vez deerr == nil
? Se houver um erro, o arquivo provavelmente não existe?O que outras respostas perderam, é que o caminho fornecido para a função pode realmente ser um diretório. A função a seguir garante que o caminho seja realmente um arquivo.
Outra coisa a destacar: esse código ainda pode levar a uma condição de corrida, em que outro thread ou processo exclui ou cria o arquivo especificado, enquanto a função fileExists está em execução.
Se você estiver preocupado com isso, use um bloqueio em seus threads, serialize o acesso a essa função ou use um semáforo entre processos, se vários aplicativos estiverem envolvidos. Se outras aplicações estiverem envolvidas, fora do seu controle, você estará sem sorte, eu acho.
fonte
fonte
O exemplo da função:
fonte
Vejamos alguns aspectos primeiro: ambas as funções fornecidas pelo
os
pacotegolang
não são utilitários, mas verificadores de erros. O que quero dizer com isso é que eles são apenas um invólucro para lidar com erros em plataformas cruzadas.Então, basicamente, se
os.Stat
essa função não der nenhum erro, significa que o arquivo existe, se você precisar verificar que tipo de erro é, aqui vem o uso dessas duas funçõesos.IsNotExist
eos.IsExist
.Isso pode ser entendido como o
Stat
erro de lançamento do arquivo porque ele não existe ou é um erro de lançamento porque existe e há algum problema com ele.O parâmetro que essas funções assumem é do tipo
error
, embora você possa passarnil
para ele, mas não faria sentido.Isso também aponta para o fato de que
IsExist is not same as !IsNotExist
são duas coisas diferentes.Portanto, agora, se você quiser saber se um determinado arquivo existe, prefiro a melhor maneira:
fonte
Como mencionado em outras respostas, é possível construir o comportamento / erros necessários usando diferentes sinalizadores
os.OpenFile
. De fato,os.Create
é apenas uma abreviação de padrões sensíveis para fazer isso:Você mesmo deve combinar essas bandeiras para obter o comportamento em que está interessado:
Dependendo do que você escolher, você receberá erros diferentes.
Aqui está um exemplo em que desejo abrir um arquivo para gravação, mas somente truncarei um arquivo existente se o usuário disser que está OK:
fonte
Melhor maneira de verificar se o arquivo existe:
fonte