leer - comprobar si existe un archivo c++
¿Cuál es la mejor manera de verificar si existe un archivo en C?(plataforma cruzada) (8)
Busque la función access()
, que se encuentra en unistd.h
. Puedes reemplazar tu función con
if( access( fname, F_OK ) != -1 ) {
// file exists
} else {
// file doesn''t exist
}
También puede usar R_OK
, W_OK
y X_OK
en lugar de F_OK
para verificar el permiso de lectura, el permiso de escritura y el permiso de ejecución (respectivamente) en lugar de la existencia, y puede O cualquiera de ellos juntos (es decir, verificar el permiso de lectura y escritura) utilizando R_OK|W_OK
)
Actualización : Tenga en cuenta que en Windows, no puede usar W_OK
para probar de forma confiable el permiso de escritura, ya que la función de acceso no tiene en cuenta las DACL. access( fname, W_OK )
puede devolver 0 (éxito) porque el archivo no tiene el conjunto de atributos de solo lectura, pero es posible que aún no tenga permiso para escribir en el archivo.
¿Hay una manera mejor que simplemente tratando de abrir el archivo?
int exists(const char *fname)
{
FILE *file;
if ((file = fopen(fname, "r")))
{
fclose(file);
return 1;
}
return 0;
}
Creo que la función access() , que se encuentra en unistd.h
es una buena opción para Linux
(también puede usar stat ).
Puedes usarlo así:
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
void fileCheck(const char *fileName);
int main (void) {
char *fileName = "/etc/sudoers";
fileCheck(fileName);
return 0;
}
void fileCheck(const char *fileName){
if(!access(fileName, F_OK )){
printf("The File %s/t was Found/n",fileName);
}else{
printf("The File %s/t not Found/n",fileName);
}
if(!access(fileName, R_OK )){
printf("The File %s/t can be read/n",fileName);
}else{
printf("The File %s/t cannot be read/n",fileName);
}
if(!access( fileName, W_OK )){
printf("The File %s/t it can be Edited/n",fileName);
}else{
printf("The File %s/t it cannot be Edited/n",fileName);
}
if(!access( fileName, X_OK )){
printf("The File %s/t is an Executable/n",fileName);
}else{
printf("The File %s/t is not an Executable/n",fileName);
}
}
Y obtienes la siguiente salida:
The File /etc/sudoers was Found
The File /etc/sudoers cannot be read
The File /etc/sudoers it cannot be Edited
The File /etc/sudoers is not an Executable
De la ayuda de Visual C ++, tiendo a ir con
/* ACCESS.C: This example uses _access to check the
* file named "ACCESS.C" to see if it exists and if
* writing is allowed.
*/
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
void main( void )
{
/* Check for existence */
if( (_access( "ACCESS.C", 0 )) != -1 )
{
printf( "File ACCESS.C exists/n" );
/* Check for write permission */
if( (_access( "ACCESS.C", 2 )) != -1 )
printf( "File ACCESS.C has write permission/n" );
}
}
También vale la pena señalar los valores de modo de _accesss (const char * path, int mode )
00 Existencia solamente
02 permiso de escritura
04 permiso de lectura
06 permiso de lectura y escritura
Como su fopen podría fallar en situaciones donde el archivo existía pero no pudo abrirse según lo solicitado.
Edición: acaba de leer la publicación de Mecki. stat () se ve como una manera más limpia de ir. Ho hum.
Por lo general, cuando desea comprobar si existe un archivo, es porque desea crear ese archivo si no existe. La respuesta de Graeme Perrow es buena si no desea crear ese archivo, pero es vulnerable a una condición de carrera si lo hace: otro proceso podría crear el archivo entre usted, verificando si existe, y de hecho lo abre para escribirlo . (No te rías ... esto podría tener malas implicaciones de seguridad si el archivo creado fuera un enlace simbólico).
Si quieres verificar la existencia y crear el archivo si no existe, atómicamente para que no haya condiciones de carrera, usa esto:
#include <fcntl.h>
#include <errno.h>
fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0) {
/* failure */
if (errno == EEXIST) {
/* the file already existed */
...
}
} else {
/* now you can use the file */
}
Puedes usar la función realpath ().
resolved_file = realpath(file_path, NULL);
if (!resolved_keyfile) {
/*File dosn''t exists*/
perror(keyfile);
return -1;
}
Sí. Utilice stat (). Ver link .
Stat fallará si el archivo no existe, de lo contrario lo más probable es que tenga éxito. Si existe, pero no tiene acceso de lectura al directorio donde existe, también fallará, pero en ese caso, cualquier método fallará (¿cómo puede inspeccionar el contenido de un directorio que no puede ver de acuerdo con los derechos de acceso? Simplemente, no puedes).
Oh, como alguien más mencionó, también puedes usar access (). Sin embargo, prefiero stat (), ya que si el archivo existe, inmediatamente me dará mucha información útil (cuándo se actualizó por última vez, qué tan grande es, el propietario y / o el grupo que posee el archivo, los permisos de acceso, etc.) .
Usa estadísticas como esta:
int file_exist (char *filename)
{
struct stat buffer;
return (stat (filename, &buffer) == 0);
}
y llámalo así:
if (file_exist ("myfile.txt"))
{
printf ("It exists/n");
}
FILE *file;
if((file = fopen("sample.txt","r"))!=NULL)
{
// file exists
fclose(file);
}
else
{
//File not found, no memory leak since ''file'' == NULL
//fclose(file) would cause an error
}