manejo - ¿Cuál es la mejor manera de verificar si existe un archivo en C++?(plataforma cruzada)
manejo de archivos en c pdf (8)
¿Qué tal el access
?
#include <io.h>
if (_access(filename, 0) == -1)
{
// File does not exist
}
He leído las respuestas de ¿Cuál es la mejor manera de verificar si existe un archivo en C? (plataforma cruzada) , pero me pregunto si hay una forma mejor de hacerlo utilizando librerías estándar de c ++. Preferiblemente sin intentar abrir el archivo en absoluto.
Tanto la stat
como el access
son bastante ingociables. ¿Qué debería #include
para usar estos?
Otra posibilidad consiste en utilizar la función good()
en la secuencia:
#include <fstream>
bool checkExistence(const char* filename)
{
ifstream Infield(filename);
return Infield.good();
}
Soy un usuario feliz y seguramente usaré la solución de Andreas. Pero si no tuvo acceso a las bibliotecas de impulso, puede usar la biblioteca de flujo:
ifstream file(argv[1]);
if (!file)
{
// Can''t open file
}
No es tan bueno como boost :: filesystem :: existe ya que el archivo realmente se abrirá ... pero eso es generalmente lo siguiente que quieres hacer de todos modos.
Tenga cuidado con las condiciones de carrera: si el archivo desaparece entre la marca "exists" y la hora en que lo abre, su programa fallará inesperadamente.
Es mejor ir y abrir el archivo, verificar el error y si todo está bien, entonces haga algo con el archivo. Es aún más importante con el código de seguridad crítica.
Detalles sobre condiciones de seguridad y carrera: http://www.ibm.com/developerworks/library/l-sprace.html
Use boost::filesystem :
#include <boost/filesystem.hpp>
if ( !boost::filesystem::exists( "myfile.txt" ) )
{
std::cout << "Can''t find my file!" << std::endl;
}
Use stat (), si es lo suficientemente multiplataforma para sus necesidades. Sin embargo, no es estándar en C ++, sino POSIX.
En MS Windows hay _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
Volvería a intentar averiguar si existe un archivo. En su lugar, debe tratar de abrirlo (en Estándar C o C ++) en el mismo modo que tiene la intención de usarlo. ¿De qué sirve saber que el archivo existe si, por ejemplo, no puede escribirse cuando lo necesita?
NO SE NECESITA boost , que sería una exageración .
Use stat() (aunque no sea multiplataforma como lo menciona pavon), así:
#include <sys/stat.h>
#include <iostream>
// true if file exists
bool fileExists(const std::string& file) {
struct stat buf;
return (stat(file.c_str(), &buf) == 0);
}
int main() {
if(!fileExists("test.txt")) {
std::cerr << "test.txt doesn''t exist, exiting.../n";
return -1;
}
return 0;
}
Salida:
C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt
ls: test.txt: No such file or directory
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
test.txt doesn''t exist, exiting...
Otra versión (y eso) se puede encontrar here .