He leído las respuestas de ¿Cuál es la mejor manera de comprobar si existe un archivo en C? (multiplataforma) , pero me pregunto si hay una mejor manera de hacer esto usando libs estándar de C ++. Preferiblemente sin intentar abrir el archivo en absoluto.
Ambos stat
y access
son prácticamente ingooglebles. ¿Qué debo #include
usar estos?
Respuestas:
Utilice boost :: sistema de archivos :
fuente
Tenga cuidado con las condiciones de carrera: si el archivo desaparece entre la comprobación de "existe" y el momento en que lo abre, su programa fallará inesperadamente.
Es mejor ir y abrir el archivo, verificar si hay fallas y si todo está bien, haga algo con el archivo. Es aún más importante con el código crítico para la seguridad.
Detalles sobre seguridad y condiciones de carrera: http://www.ibm.com/developerworks/library/l-sprace.html
fuente
Soy un usuario de boost feliz y sin duda usaría la solución de Andreas. Pero si no tuvo acceso a las bibliotecas de impulso, puede usar la biblioteca de transmisión:
No es tan agradable como boost :: filesystem :: existe, ya que el archivo se abrirá realmente ... pero eso es lo siguiente que suele querer hacer de todos modos.
fuente
Utilice stat (), si es lo suficientemente multiplataforma para sus necesidades. Sin embargo, no es el estándar C ++, sino POSIX.
En MS Windows hay _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
fuente
¿Qué tal
access
?fuente
Otra posibilidad consiste en utilizar la
good()
función en el stream:fuente
Reconsideraría intentar averiguar si existe un archivo. En su lugar, debe intentar abrirlo (en Standard C o C ++) en el mismo modo en el que desea usarlo. ¿De qué sirve saber que el archivo existe si, por ejemplo, no se puede escribir cuando es necesario utilizarlo?
fuente
ls
programa similar? Supongo que el póster original aquí no quiere abrir el archivo, en absoluto. Sin embargo, se supone que la función de estadísticas de Posix le brinda información sobre los permisos del archivo, por lo que solucionaría ese problema.Si su compilador es compatible con C ++ 17, no necesita boost, simplemente puede usar
std::filesystem::exists
fuente
NO aumentarREQUERIDO , lo cual sería una exageración .
Use stat () (no multiplataforma, como lo menciona pavon), así:
Salida:
Otra versión (y esa) se puede encontrar aquí .
fuente
Si ya está usando la clase de flujo de archivos de entrada (
ifstream
), puede usar su funciónfail()
.Ejemplo:
fuente