使用stat()
函数检索到的stat
结构的st_mode
成员被用于测试文件是否为普通文件(即在磁盘或大容量存储器上而不是目录、套接字、符号链接等)。
struct stat sb;
if( stat( file_path, &sb) != -1)
{
if( S_ISREG( sb.st_mode ) != 0 )
{
printf( "%s is a file", file_path ) ;
}
else
{
printf( "%s is not a file", file_path ) ;
}
}
st_mode
成员包含被 S_IFMT
(0170000)掩码屏蔽的 4 个位。这些位的值为:
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
因此,宏S_ISREG可能被定义为:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
由于它是一个宏,你可以在头文件sys/stat.h
中查看其实际定义。在GNU头文件中,它被定义为:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
这基本上与我简化版本的相同。
S_ISREG
只是其中的一小部分。stat()
手册中的示例显示了对st_mode
的测试 - 这些宏只是将该测试包装成布尔结果。 - Cliffordman 2 stat
运行得非常完美。 - wildplasser