Eu li as respostas para Qual é a melhor maneira de verificar se existe um arquivo em C? (plataforma cruzada) , mas estou me perguntando se há uma maneira melhor de fazer isso usando libs c ++ padrão? De preferência, sem tentar abrir o arquivo.
Ambos stat
e access
são praticamente indigestíveis. O que devo #include
usar isso?
Respostas:
Use boost :: filesystem :
fonte
Tenha cuidado com as condições de corrida: se o arquivo desaparecer entre a verificação "existe" e o momento em que você o abrir, seu programa falhará inesperadamente.
É melhor abrir o arquivo, verificar se há falhas e se tudo está bem, fazer algo com o arquivo. É ainda mais importante com código crítico de segurança.
Detalhes sobre segurança e condições de corrida: http://www.ibm.com/developerworks/library/l-sprace.html
fonte
Sou um usuário feliz e certamente usaria a solução do Andreas. Mas se você não teve acesso às bibliotecas de impulso, você pode usar a biblioteca de fluxo:
Não é tão bom quanto boost :: filesystem :: exists uma vez que o arquivo será realmente aberto ... mas geralmente é a próxima coisa que você quer fazer de qualquer maneira.
fonte
Use stat (), se for multiplataforma o suficiente para suas necessidades. Não é o padrão C ++, mas POSIX.
No MS Windows, existe _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
fonte
Que tal
access
?fonte
Outra possibilidade consiste em usar a
good()
função no stream:fonte
Eu reconsideraria tentar descobrir se existe um arquivo. Em vez disso, você deve tentar abri-lo (em C padrão ou C ++) no mesmo modo em que pretende usá-lo. Qual a utilidade de saber que o arquivo existe se, digamos, não for gravável quando você precisa usá-lo?
fonte
ls
programa semelhante? Suponho que o autor da postagem original não deseja abrir o arquivo de forma alguma. A função stat do Posix supostamente fornece informações sobre as permissões do arquivo, portanto, resolveria o problema.Se o seu compilador suporta C ++ 17, você não precisa de impulso, você pode simplesmente usar
std::filesystem::exists
fonte
NÃO impulsoREQUERIDO , o que seria um exagero .
Use stat () (não plataforma cruzada, embora conforme mencionado por pavon), assim:
Resultado:
Outra versão (e essa) pode ser encontrada aqui .
fonte
Se você já estiver usando a classe de fluxo de arquivo de entrada (
ifstream
), poderá usar sua funçãofail()
.Exemplo:
fonte