代码
/*02 - 获取文件属性 */
#include <stdio.h> // 标准输入输出头文件
#include <stdlib.h> // 标准库头文件
#include <string.h> // 字符串处理头文件
#include <unistd.h> // UNIX标准头文件
#include <fcntl.h> // 文件控制头文件
#include <sys/types.h> // 系统数据类型头文件
#include <sys/stat.h> // 文件状态头文件
#include <sys/time.h> // 时间相关头文件
#include <time.h> // 时间处理头文件
int main(int argc, char *argv[]) // 主函数
{
struct stat buf; // 定义文件状态结构体
if(argc != 2) // 检查参数数量是否正确
{
printf("Usage: %s <link filename>\n", argv[0]); // 打印使用说明
exit(1); // 退出程序
}
if(stat(argv[1], &buf) == -1) // 获取文件状态信息
{
perror("stat"); // 打印错误信息
exit(1); // 退出程序
}
//inode编号
printf("inode number: %ld\n", buf.st_ino); // 打印inode节点号
//文件大小
printf("file size: %ld\n", buf.st_size); // 打印文件大小(字节)
//文件类型
printf("file type: %c\n", S_ISREG(buf.st_mode) ? '-' : 'l'); // 判断并打印文件类型
//文件权限
printf("file permission: 0%o\n", buf.st_mode & 0777); // 打印文件权限(八进制)
//最后访问时间
printf("last access time: %s", ctime(&buf.st_atime)); // 打印最后访问时间
//最后修改时间
printf("last modify time: %s", ctime(&buf.st_mtime)); // 打印最后修改时间
//最后状态改变时间
printf("last status change time: %s", ctime(&buf.st_ctime)); // 打印最后状态改变时间
printf("-------------------------------\n"); // 打印分隔线
if(lstat(argv[1], &buf) == -1) // 使用lstat获取文件状态(不跟随符号链接)
{
perror("stat"); // 打印错误信息
exit(1); // 退出程序
}
//inode编号
printf("inode number: %ld\n", buf.st_ino); // 再次打印inode节点号
//文件大小
printf("file size: %ld\n", buf.st_size); // 再次打印文件大小
//文件类型
printf("file type: %c\n", S_ISREG(buf.st_mode) ? '-' : 'l'); // 再次判断并打印文件类型
//文件权限
printf("file permission: 0%o\n", buf.st_mode & 0777); // 再次打印文件权限
//最后访问时间
printf("last access time: %s", ctime(&buf.st_atime)); // 再次打印最后访问时间
//最后修改时间
printf("last modify time: %s", ctime(&buf.st_mtime)); // 再次打印最后修改时间
//最后状态改变时间
printf("last status change time: %s", ctime(&buf.st_ctime)); // 再次打印最后状态改变时间
return 0; // 程序正常结束
}

代码功能说明:
-
文件属性获取 :通过
stat()
和lstat()
系统调用获取文件的详细属性信息 -
信息展示:
-
inode节点号
-
文件大小(字节)
-
文件类型(普通文件显示"-",符号链接显示"l")
-
文件权限(八进制表示)
-
三种时间戳:
-
最后访问时间(atime)
-
最后修改时间(mtime)
-
最后状态改变时间(ctime)
-
-
-
特殊处理:
-
使用
lstat()
可以获取符号链接本身的信息(而非链接指向的文件) -
两次获取信息是为了对比
stat()
和lstat()
的区别
-
使用示例:
bash
./program testfile # 查看testfile的文件属性