获取文件信息 stat函数
Linux stat函数讲解
头文件: #include <sys/stat.h>
函数定义: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
/*stat结构体定义:
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //成员可以解析出文件类型,文件权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID, 可以通过getpwuid所返回的结构体获取用户名
gid_t st_gid; //组ID, 获取组名方式可以通过getgrgid返回的结构体获取组名
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
*/
int main()
{
struct stat stInfo;
memset(&stInfo, 0, sizeof(stInfo));
int ret = stat("open.c", &stInfo);
if ( 0==ret )
{
printf("file size = %d\n", stInfo.st_size);
}
return 0;
}
注意stat返回值,获取文件信息需要解析stat填充的结构体,
注意函数入参方式 input output, stat函数填充的文件信息结构体需要在调用此函数之前分配好内存,由stat函数负责填充,所以文件信息结构体既是一个input类型入参又是一个output类型入参
errno错误代码 | |
---|---|
ENOENT | 参数file_name指定的文件不存在 |
ENOTDIR | 路径中的目录存在但却非真正的目录 |
ELOOP | 欲打开的文件有过多符号连接问题,上限为16符号连接 |
EFAULT | 参数buf为无效指针,指向无法存在的内存空间 |
EACCESS | 存取文件时被拒绝 |
ENOMEM | 核心内存不足 |
ENAMETOOLONG | 参数file_name的路径名称太长 |
目录
DIR、dirent、stat等结构体详解
opendir、readdir、closedir函数详解
例子:
#include <sys/types.h>
#include <dirent.h>
int OpenDir()
{
//DIR *opendir(const char *name);
//opendir路径也是文件, opendir返回DIR指针, 对路径文件读写通过DIR指针进行操作
DIR *dir = opendir("../file/");
if (dir == NULL)
{
printf("open dir error\r\n");
return -1;
}
//struct dirent
//{
// ino_t d_ino; /* inode number */
// off_t d_off; /* not an offset; see NOTES */
// unsigned short d_reclen; /* length of this record */
// unsigned char d_type; /* type of file; not supported by all filesystem types */
// char d_name[256]; /* filename */
//};
struct dirent *dirtemp = NULL;
//struct dirent *readdir(DIR *dir);
//readdir 读路径,循环读取,直到readdir返回NULL,表示路径文件读取结束,在结构体中有文件名
while( NULL!=(dirtemp=readdir(dir)) )
{
//打印目录下的文件
printf("%s\r\n",dirtemp->d_name);
}
//closedir(DIR *dir);
//关闭dir流
closedir(dir);
return 0;
}