Cómo averiguar si un archivo es un enlace?
-
10-10-2019 - |
Pregunta
Tengo el siguiente código sólo una parte de ella se muestra aquí y estoy comprobando si un tipo de archivo.
struct stat *buf /* just to show the type buf is*/
switch (buf.st_mode & S_IFMT) {
case S_IFBLK: printf(" block device\n"); break;
case S_IFCHR: printf(" character device\n"); break;
case S_IFDIR: printf(" directory\n"); break;
case S_IFIFO: printf(" FIFO/pipe\n"); break;
case S_IFLNK: printf(" symlink\n"); break;
case S_IFREG: printf(" regular file\n"); break;
case S_IFSOCK: printf(" socket\n"); break;
default: printf(" unknown?\n"); break;
}
El problema:. Valor de st_mode
obtenido cuando hago un printf("\nMode: %d\n",buf.st_mode);
el resultado es 33 188
He probado mi programa con un tipo de archivo normal y un enlace simbólico. En ambos casos el resultado fue "archivo normal" es decir el caso enlace simbólico está fallando y no llego a entender por qué?
Solución
Desde la página del stat (2)
:
stat()
estadísticas del archivo apuntado por camino y rellenos enbuf
.
lstat()
es idéntica astat()
, excepto que si la ruta es un enlace simbólico, entonces el enlace en sí es stat-ed, no el archivo que se refiere a.
En otras palabras, la llamada stat
seguirá el enlace simbólico al archivo de destino y recuperar la información para que. Trate de usar lstat
en cambio, se le dará la información para el Enlace .
Si lo hace lo siguiente:
touch junkfile
ln -s junkfile junklink
a continuación, compilar y ejecutar el programa siguiente:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main (void) {
struct stat buf;
int x;
x = stat ("junklink", &buf);
if (S_ISLNK(buf.st_mode)) printf (" stat says link\n");
if (S_ISREG(buf.st_mode)) printf (" stat says file\n");
x = lstat ("junklink", &buf);
if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n");
if (S_ISREG(buf.st_mode)) printf ("lstat says file\n");
return 0;
}
obtendrá:
stat says file
lstat says link
como se esperaba.