文件属性获取
int stat(const char *path, struct stat *buf);
功能:获取文件属性参数:
path:文件路径名
buf:保存文件属性信息的结构体返回值:
成功:0
失败:-1struct stat {ino_t st_ino; /* inode号 */mode_t st_mode; /* 文件类型和权限 */nlink_t st_nlink; /* 硬链接数 */uid_t st_uid; /* 用户ID */gid_t st_gid; /* 组ID */off_t st_size; /* 大小 */time_t st_atime; /* 最后访问时间 */time_t st_mtime; /* 最后修改时间 */time_t st_ctime; /* 最后状态改变时间 */
};
目录操作
//围绕目录流进行操作,DIR*DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:
成功:目录流
失败:NULLstruct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:
成功:读到的信息
败或读到目录结尾:NULL返回值为结构体,该结构体成员为描述该目录下的文件信息
struct dirent {
ino_t d_ino; /* 索引节点号*/
off_t d_off; /*在目录文件中的偏移*/
unsigned short d_reclen; /* 文件名长度*/
unsigned char d_type; /* 文件类型 */
char d_name[256]; /* 文件名 */
};int closedir(DIR *dirp);
功能:关闭目录
参数:dirp:目录流
使用上面的函数,结合帮助手册
想要查询stat可以使用下面命令
man 2 stat
想查看C语言函数库中的某个函数的手册,可以使用以下命令
man 3 函数名
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>void ls(const char *path) {DIR *dir;struct dirent *entry;struct stat file_stat;// 打开目录dir = opendir(path);if (dir == NULL) {perror("opendir");return;}// 读取目录中的文件while ((entry = readdir(dir)) != NULL) {// 获取文件的详细信息char file_path[256];sprintf(file_path, "%s/%s", path, entry->d_name);if (stat(file_path, &file_stat) == -1) {perror("stat");continue;}// 获取文件权限char perms[11];perms[0] = (S_ISDIR(file_stat.st_mode)) ? 'd' : '-';perms[1] = (file_stat.st_mode & S_IRUSR) ? 'r' : '-';perms[2] = (file_stat.st_mode & S_IWUSR) ? 'w' : '-';perms[3] = (file_stat.st_mode & S_IXUSR) ? 'x' : '-';perms[4] = (file_stat.st_mode & S_IRGRP) ? 'r' : '-';perms[5] = (file_stat.st_mode & S_IWGRP) ? 'w' : '-';perms[6] = (file_stat.st_mode & S_IXGRP) ? 'x' : '-';perms[7] = (file_stat.st_mode & S_IROTH) ? 'r' : '-';perms[8] = (file_stat.st_mode & S_IWOTH) ? 'w' : '-';perms[9] = (file_stat.st_mode & S_IXOTH) ? 'x' : '-';perms[10] = '\0';// 获取文件所有者struct passwd *pw = getpwuid(file_stat.st_uid);char *owner = (pw != NULL) ? pw->pw_name : "";// 获取文件所属组struct group *gr = getgrgid(file_stat.st_gid);char *group = (gr != NULL) ? gr->gr_name : "";// 获取文件大小off_t file_size = file_stat.st_size;// 获取文件最后修改时间char *time_str = ctime(&file_stat.st_mtime);time_str[strlen(time_str)-1] = '\0'; // 去除换行符// 打印文件信息printf("%s\t%ld\t%s\t%s\t%lld\t%s\n", perms, file_stat.st_nlink, owner, group, file_size, time_str);}// 关闭目录closedir(dir);
}int main() {ls("."); // 传入要列出文件的目录return 0;
}
结果验证: