Ya no tienes que buscar más en internet ya que estás al lugar indicado, contamos con la respuesta que necesitas hallar pero sin complicarte.
Solución:
S_ISREG() es un macro se utiliza para interpretar los valores en una estructura estadística, tal como los devuelve la llamada al sistema stat(). Se evalúa a true 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 */
Pone a prueba el st_mode
miembro de 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 ) ;
los st_mode
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
entonces el macro S_ISREG podría definirse así:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
Dado que es un macro puede ver su definición real en el archivo de encabezado sys/stat.h
. En la cabecera 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.
El estándar POSIX que define S_ISREG está, de hecho, en línea.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
Cotizar:
Se proporcionarán las siguientes macros para probar si un archivo es del tipo especificado. El valor metro suministrado a las macros es el valor de modo_st a partir de una estadística estructura. los macro evaluará a un valor distinto de cero si la prueba es true; 0 si la prueba es false.
[…]
S_ISFIFO(metro)
Prueba para una tubería o archivo especial FIFO.
S_ISREG(metro)
Prueba para un archivo regular.
S_ESLNK(metro)
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 de la st_mode
miembro de esta estructura, un tipo entero, se puede probar con este 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 S_ISREG
que se puede trabajar fácilmente.
Si tienes alguna duda y forma de mejorar nuestro noticia puedes añadir una acotación y con placer lo ojearemos.