S_ISREG() es una macro que se utiliza para interpretar los valores en una estructura estadística, tal como los devuelve la llamada al sistema stat(). Se evalúa como verdadero si el argumento (el miembro st_mode en struct stat) es un archivo normal.
Ver man stat
, man fstat
o man inode
(enlace a la página de manual de inode) para obtener más detalles. Aquí está la parte relevante de la página man:
Because tests of the above form are common, additional macros are defined by POSIX to allow the test of the file type in st_mode to be written more concisely:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
The preceding code snippet could thus be rewritten as:
stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
/* Handle regular file */
}
El estándar POSIX que define S_ISREG está en línea.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
Cita:
Se proporcionarán las siguientes macros para probar si un archivo es del tipo especificado. El valor m suministrado a las macros es el valor de st_mode de una estadística estructura. La macro se evaluará a un valor distinto de cero si la prueba es verdadera; 0 si la prueba es falsa.
[...]
S_ISFIFO(m )
Prueba para una tubería o archivo especial FIFO.
S_ISREG(m )
Prueba para un archivo regular.
S_ISLNK(m )
Prueba de un enlace simbólico.
[...]
Una forma típica de usar S_ISREG es llamar primero al stat
función para llenar un struct stat
objeto con información sobre un archivo. Entonces el valor del st_mode
miembro de esta estructura, un tipo entero, se puede probar con esta macro.
Además del estándar, hay páginas de manual de varios sistemas en línea, así como tutoriales sobre programación con stat. La Wikipedia tiene una página sobre estadísticas, con un ejemplo de código aparentemente completo. Aunque no cuenta con S_ISREG
, que se puede trabajar fácilmente.
Prueba el st_mode
miembro del stat
estructura recuperada usando el stat()
función para determinar si el archivo es un archivo regular (es decir, en un disco o almacenamiento masivo en lugar de decir un directorio, socket, enlace simbólico, por ejemplo.
struct stat sb;
if( stat( file_path, &sb) != -1) // Check the return value of stat
{
if( S_ISREG( sb.st_mode ) != 0 )
{
printf( "%s is a file", file_path ) ;
}
else
{
printf( "%s is not a file", file_path ) ;
}
}
El st_mode
el miembro contiene 4 bits enmascarados por S_IFMT
(0170000). Los valores de estos bits son:
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
por lo que la macro S_ISREG podría definirse así:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
Dado que es una macro, puede ver su definición real en el archivo de encabezado sys/stat.h
. En el encabezado GNU se define esto:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
que es esencialmente lo mismo en mi versión simplificada.