可以通过上面提供的函数,返回一个结构体,保存着文件的信息。
stat函数讲解
表头文件: #include
#include
定义函数: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
#include
#include
#include
int main() {
struct stat buf;
stat("/etc/hosts", &buf);
printf("/etc/hosts file size = %d\n", buf.st_size);
}
stat结构中最常用到的属性是st_mode(文件的类型及文件的访问权限)、st_nlink(硬链接数,表示有几个链接到该文件上)、st_uid、st_gid、st_size(以字节为单位的文件长度,只对普通文件、目录文件和符号连接有意义)、st_atime、st_mtime、st_ctime。
我们曾一再提到Unix系统中一切皆可视为文件,不过细而化之的话又可以分为多种类型,那么在程序中如何去对文件类型进行判别呢?这就需要用到下表中所示的一些宏:
宏
作用
S_ISREG()
测试是否为普通文件
S_ISDIR()
测试是否为目录文件
S_ISCHR()
测试是否为字符特殊文件
S_ISBLK()
测试是否为块特殊文件
S_ISFIFO()
测试是否为FIFO文件
S_ISLNK()
测试是否为链接文件
S_ISSOCK()
测试是否为socket文件
S_ISUID()
测试是否设置了“设置-用户-ID”位
S_ISGID()
测试是否设置了“设置-组-ID”位
#include
#include
#include
#include
#include
#include
int main(int argc, char * argv[])
{
int i;
struct stat buf;
char *ptr;
for(i=1; i< argc; i++)
{
printf("%s: ", argv[i]);
if(lstat(argv[i],&buf)<0)
{
printf("lstat error.");
continue;
}
if(S_ISREG(buf.st_mode)) ptr = "regular";
else if(S_ISDIR(buf.st_mode)) ptr = "directory";
else if(S_ISCHR(buf.st_mode)) ptr = "char special";
else if(S_ISBLK(buf.st_mode)) ptr = "block special";
else if(S_ISFIFO(buf.st_mode)) ptr = "fifo";
else ptr = "Others";
printf(" %s\n",ptr );
}
return 0;
}