C语言如何读取文件属性
创作时间:
作者:
@小白创作中心
C语言如何读取文件属性
引用
1
来源
1.
https://docs.pingcode.com/baike/1225055
在C语言开发中,了解如何读取文件属性是非常重要的技能。本文将详细介绍如何使用stat和fstat函数获取文件的大小、权限、最后修改时间等信息,并提供详细的示例代码。
一、使用stat函数读取文件属性
stat函数是C语言标准库中的一个函数,主要用于获取文件的状态信息。它的原型如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
stat函数接受两个参数:文件路径和一个指向stat结构体的指针。调用该函数后,文件的属性信息将存储在stat结构体中。
1.1、结构体stat的成员
stat结构体定义在sys/stat.h头文件中,包含多个成员用于存储文件属性信息。常用的成员包括:
- st_mode:文件类型和权限
- st_size:文件大小(字节数)
- st_atime:最后访问时间
- st_mtime:最后修改时间
- st_ctime:最后状态改变时间
1.2、示例代码
以下是一个示例代码,演示如何使用stat函数读取文件属性:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
void print_file_info(const char *filename) {
struct stat file_stat;
if (stat(filename, &file_stat) == -1) {
perror("stat");
return;
}
printf("File: %sn", filename);
printf("Size: %ld bytesn", file_stat.st_size);
printf("Permissions: %on", file_stat.st_mode & 0777);
printf("Last accessed: %ldn", file_stat.st_atime);
printf("Last modified: %ldn", file_stat.st_mtime);
printf("Last status change: %ldn", file_stat.st_ctime);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file_path>n", argv[0]);
return 1;
}
print_file_info(argv[1]);
return 0;
}
在上面的代码中,我们定义了一个函数print_file_info,用于打印文件的基本信息。stat函数被用于获取文件的属性信息,并将这些信息打印到标准输出。
二、使用fstat函数读取文件属性
fstat函数与stat函数类似,但它接受一个文件描述符而不是文件路径。其原型如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int fstat(int fd, struct stat *buf);
2.1、示例代码
以下是一个示例代码,演示如何使用fstat函数读取文件属性:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
void print_file_info(int fd) {
struct stat file_stat;
if (fstat(fd, &file_stat) == -1) {
perror("fstat");
return;
}
printf("Size: %ld bytesn", file_stat.st_size);
printf("Permissions: %on", file_stat.st_mode & 0777);
printf("Last accessed: %ldn", file_stat.st_atime);
printf("Last modified: %ldn", file_stat.st_mtime);
printf("Last status change: %ldn", file_stat.st_ctime);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file_path>n", argv[0]);
return 1;
}
int fd = open(argv[1], O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
print_file_info(fd);
close(fd);
return 0;
}
三、文件权限和类型解析
在stat结构体中,st_mode成员用于存储文件的类型和权限信息。可以使用以下宏和操作符来解析文件类型和权限:
3.1、文件类型宏
- S_ISREG(m):是否为常规文件
- S_ISDIR(m):是否为目录
- S_ISLNK(m):是否为符号链接
- S_ISCHR(m):是否为字符设备
- S_ISBLK(m):是否为块设备
- S_ISFIFO(m):是否为FIFO/管道
- S_ISSOCK(m):是否为套接字
3.2、文件权限操作符
- S_IRUSR:文件所有者的读权限
- S_IWUSR:文件所有者的写权限
- S_IXUSR:文件所有者的执行权限
- S_IRGRP:文件所属组的读权限
- S_IWGRP:文件所属组的写权限
- S_IXGRP:文件所属组的执行权限
- S_IROTH:其他用户的读权限
- S_IWOTH:其他用户的写权限
- S_IXOTH:其他用户的执行权限
3.3、示例代码
以下是一个示例代码,演示如何解析文件类型和权限:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
void print_file_type_and_permissions(const char *filename) {
struct stat file_stat;
if (stat(filename, &file_stat) == -1) {
perror("stat");
return;
}
printf("File: %sn", filename);
printf("Type: ");
if (S_ISREG(file_stat.st_mode)) {
printf("regular filen");
} else if (S_ISDIR(file_stat.st_mode)) {
printf("directoryn");
} else if (S_ISLNK(file_stat.st_mode)) {
printf("symbolic linkn");
} else if (S_ISCHR(file_stat.st_mode)) {
printf("character devicen");
} else if (S_ISBLK(file_stat.st_mode)) {
printf("block devicen");
} else if (S_ISFIFO(file_stat.st_mode)) {
printf("FIFO/pipen");
} else if (S_ISSOCK(file_stat.st_mode)) {
printf("socketn");
} else {
printf("unknownn");
}
printf("Permissions: ");
printf((file_stat.st_mode & S_IRUSR) ? "r" : "-");
printf((file_stat.st_mode & S_IWUSR) ? "w" : "-");
printf((file_stat.st_mode & S_IXUSR) ? "x" : "-");
printf((file_stat.st_mode & S_IRGRP) ? "r" : "-");
printf((file_stat.st_mode & S_IWGRP) ? "w" : "-");
printf((file_stat.st_mode & S_IXGRP) ? "x" : "-");
printf((file_stat.st_mode & S_IROTH) ? "r" : "-");
printf((file_stat.st_mode & S_IWOTH) ? "w" : "-");
printf((file_stat.st_mode & S_IXOTH) ? "x" : "-");
printf("n");
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file_path>n", argv[0]);
return 1;
}
print_file_type_and_permissions(argv[1]);
return 0;
}
在这段代码中,我们定义了一个函数print_file_type_and_permissions,用于打印文件的类型和权限信息。通过使用stat函数获取文件属性并解析st_mode成员,我们能够确定文件的类型和权限。
四、总结
通过本文的介绍,您已经了解了如何在C语言中使用stat和fstat函数读取文件属性,并掌握了解析文件类型和权限的方法。在实际的项目开发中,这些知识可以帮助您更好地管理和跟踪文件属性,提升开发效率。
热门推荐
兰州到宝鸡自驾游攻略大揭秘
兰州到宝鸡高铁攻略:最快仅需两小时!
兰州到宝鸡高铁最新攻略:中转方案及未来规划全解析
《皂罗袍》:穿越千年的旋律
梁思成晚年坦言:林徽因太聪明,喜欢她的人太多,做他的丈夫很累
名“家”解读丨“离异、单身”的佟丽娅,背后最大的支撑,是他……
《卡车之星》与现实驾驶的差距有多大?
孕妇瑜伽:缓解孕期酸痛的最佳姿势
株洲市中心医院产科教你缓解孕期酸痛
孕期酸痛怎么办?准妈妈自测按摩技巧
孕期酸痛怎么办?中医调理+心理调节,这些小妙招帮你轻松应对
心态重于情绪 心理学教授彭凯平畅谈职场人士的困境与解决之道
科学挂电视,护眼又护颈:电视机最佳悬挂高度指南
电视机悬挂高度的科学与风水:你家挂对了吗?
小米电视安装攻略:最佳悬挂高度与实用技巧
科学揭秘:客厅电视悬挂高度的秘密
《牡丹亭游园》诗词艺术解析:从语言到意境的完美融合
老年FPS玩家的专注力训练秘籍
五岔子大桥下的江滩公园:成都人的滨水休闲新去处
夜游锦江城南段启航!6.5公里水上航线串联城南地标
周杰伦快手直播再掀热潮,新歌发布展现持续影响力
周杰伦新歌《Six Degrees》上线华为音乐:一首充满浪漫与惊喜的R&B情歌
周杰伦新专辑《最伟大的作品》即将发行,携手郎朗再创佳作
厦门北站必打卡:鼓浪屿、南普陀寺、曾厝垵
鼓浪屿打卡,厦门北站周边的浪漫之旅
春风剪刀下的柳树之美
品尝甘肃油饼,感受西北醇厚味道
仓库管理:从基础概念到实践应用
一个失误,终身背负?律师解析过失致死刑罚与赔偿!
创新演绎让昆曲《牡丹亭》焕发新生