文件I/O实践(2) --文件stat
功能:获取文件元数据
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf);
stat结构体
struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ };
//示例 - err_exit函数如前 // 其实可以通过Linux 系统调用major, minor来替换(如下) #define MAJOR(a) (int)((unsigned short)a >> 8) //主设备号: 获取高8位 #define MINOR(a) (int)((unsigned short)a & 0xFF)//次设备号: 获取低8位 bool fileType(const struct stat &fileStat); void filePerm(const struct stat &fileStat, char *perm); int main(int argc, char *argv[]) { if (argc != 2) { cerr << "Usage: " << argv[0] << " <file-name>" << endl; exit(EXIT_FAILURE); } struct stat fileStat; if (lstat(argv[1], &fileStat) == -1) err_exit("stat error"); cout << "file-name: " << argv[1] << endl; cout << "st_ino = " << fileStat.st_ino << endl; cout << "device major: " << major(fileStat.st_dev) << ", minor: " << minor(fileStat.st_dev) << endl; if (fileType(fileStat)) { cout << "----------------------------" << endl; cout << "major: " << MAJOR(fileStat.st_dev) << ", minor: " << MINOR(fileStat.st_rdev) << endl; // cout << "major: " << major(fileStat.st_dev) // << ", minor: " << minor(fileStat.st_rdev) << endl; } //获取文件的权限: 但要注意需要&上07777 fprintf(stdout, "file permission: %o", fileStat.st_mode&07777); char perm[11]; filePerm(fileStat, perm); cout << ", msg: " << perm << endl; cout << "st_nlink = " << fileStat.st_nlink << endl; cout << "st_uid = " << fileStat.st_uid << endl; cout << "st_gid = " << fileStat.st_gid << endl; cout << "st_size = " << fileStat.st_size << endl; cout << "st_blksize = " << fileStat.st_blksize << endl; cout << "st_blocks = " << fileStat.st_blocks << endl; cout << "st_atime = " << fileStat.st_atime << endl; cout << "st_ctime = " << fileStat.st_ctime << endl; cout << "st_mtime = " << fileStat.st_mtime << endl; } bool fileType(const struct stat &fileStat) { cout << "file-type: "; switch(fileStat.st_mode & S_IFMT) { case S_IFSOCK: cout << "socket"; break; case S_IFLNK: cout << "symbolic link"; break; case S_IFREG: cout << "regular file"; break; case S_IFBLK: cout << "block device" << endl; return true; break; case S_IFDIR: cout << "directory"; break; case S_IFCHR: cout << "character device" << endl; return true; break; case S_IFIFO: cout << "FIFO" << endl; break; default: cout << "unknown?"; break; } cout << endl; return false; } void filePerm(const struct stat &fileStat, char *perm) { strcpy(perm, "----------"); switch(fileStat.st_mode & S_IFMT) { case S_IFSOCK: perm[0] = 's'; break; case S_IFLNK: perm[0] = 'l'; break; case S_IFREG: perm[0] = '-'; break; case S_IFBLK: perm[0] = 'b'; break; case S_IFDIR: perm[0] = 'd'; break; case S_IFCHR: perm[0] = 'c'; break; case S_IFIFO: perm[0] = 'p'; break; default: perm[0] = '?'; break; } if (fileStat.st_mode & S_IRUSR) perm[1] = 'r'; if (fileStat.st_mode & S_IWUSR) perm[2] = 'w'; if (fileStat.st_mode & S_IXUSR) perm[3] = 'x'; if (fileStat.st_mode & S_IRGRP) perm[4] = 'r'; if (fileStat.st_mode & S_IWGRP) perm[5] = 'w'; if (fileStat.st_mode & S_IXGRP) perm[6] = 'x'; if (fileStat.st_mode & S_IROTH) perm[7] = 'r'; if (fileStat.st_mode & S_IWOTH) perm[8] = 'w'; if (fileStat.st_mode & S_IXOTH) perm[9] = 'x'; }
[拓展]
1.getpwuid
struct passwd *getpwuid(uid_t uid);
//passwd结构体 struct passwd { char *pw_name; /* username */ char *pw_passwd; /* user password */ uid_t pw_uid; /* user ID */ gid_t pw_gid; /* group ID */ char *pw_gecos; /* user information */ char *pw_dir; /* home directory */ char *pw_shell; /* shell program */ };
2.getgrgid
struct group *getgrgid(gid_t gid);
//group结构体 struct group { char *gr_name; /* group name */ char *gr_passwd; /* group password */ gid_t gr_gid; /* group ID */ char **gr_mem; /* group members */ };
3. readlink
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
4. localtime
struct tm *localtime(const time_t *timep);
//tm结构体 struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ };
//示例: 实现简单的ls -l功能 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <grp.h> #include <pwd.h> #include <time.h> using namespace std; inline void err_exit(std::string message); bool isDevice(const struct stat &fileStat); bool isLink(const struct stat &fileStat); void filePerm(const struct stat &fileStat, char *perm); int main(int argc, char *argv[]) { if (argc != 2) { cerr << "Usage: " << argv[0] << " <file-name>" << endl; exit(EXIT_FAILURE); } struct stat fileStat; if (lstat(argv[1], &fileStat) == -1) err_exit("lstat error"); //获取权限 char perm[11]; filePerm(fileStat, perm); cout << perm << ' '; //获取文件链接数 cout << fileStat.st_nlink << ' '; //获取文件所有者 struct passwd *ps = getpwuid(fileStat.st_uid); cout << ps->pw_name << ' '; //获取文件所属组 struct group *gp = getgrgid(fileStat.st_gid); cout << gp->gr_name << ' '; if (isDevice(fileStat)) cout << major(fileStat.st_dev) << ", " << minor(fileStat.st_rdev) << ' '; else cout << fileStat.st_size << ' '; // 打印最后一次修改时间 time_t mtime = fileStat.st_mtime; struct tm *pTime = localtime(&mtime); cout << pTime->tm_mon+1 << "月 " << pTime->tm_mday << ' ' << pTime->tm_hour << ':' << pTime->tm_min << ' '; // 打印文件名 cout << argv[1]; if (isLink(fileStat)) { cout << " -> "; char name[1024] = {0}; if (readlink(argv[1], name, sizeof(name)) == -1) err_exit("readlink error"); cout << name; } cout << endl; } inline void err_exit(std::string message) { perror(message.c_str()); exit(EXIT_FAILURE); }
bool isDevice(const struct stat &fileStat) { switch(fileStat.st_mode & S_IFMT) { case S_IFBLK: case S_IFCHR: return true; break; default: return false; break; } return false; }
bool isLink(const struct stat &fileStat) { if ((fileStat.st_mode & S_IFMT) == S_IFLNK) return true; return false; }
void filePerm(const struct stat &fileStat, char *perm) { strcpy(perm, "----------"); switch(fileStat.st_mode & S_IFMT) { case S_IFSOCK: perm[0] = 's'; break; case S_IFLNK: perm[0] = 'l'; break; case S_IFREG: perm[0] = '-'; break; case S_IFBLK: perm[0] = 'b'; break; case S_IFDIR: perm[0] = 'd'; break; case S_IFCHR: perm[0] = 'c'; break; case S_IFIFO: perm[0] = 'p'; break; default: perm[0] = '?'; break; } if (fileStat.st_mode & S_IRUSR) perm[1] = 'r'; if (fileStat.st_mode & S_IWUSR) perm[2] = 'w'; if (fileStat.st_mode & S_IXUSR) perm[3] = 'x'; if (fileStat.st_mode & S_IRGRP) perm[4] = 'r'; if (fileStat.st_mode & S_IWGRP) perm[5] = 'w'; if (fileStat.st_mode & S_IXGRP) perm[6] = 'x'; if (fileStat.st_mode & S_IROTH) perm[7] = 'r'; if (fileStat.st_mode & S_IWOTH) perm[8] = 'w'; if (fileStat.st_mode & S_IXOTH) perm[9] = 'x'; }
文件I/O实践(2) --文件stat的更多相关文章
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Linux实践:文件破解
Linux实践:文件破解 标签(空格分隔): 20135321余佳源 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP指令 ...
- 转 Jmeter测试实践:文件上传接口
Jmeter测试实践:文件上传接口 1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求. Basic部分修改如下: Advanced部分我做任何 ...
- vue 单文件组件最佳实践
vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...
- 文件I/O实践(3) --文件共享与fcntl
文件共享 一个进程打开了两个文件 文件表条目(file-table-entry): 1.文件状态标志(file-status-flags): 读/写/追加/同步/非阻塞等; 2.当前文件偏移量 3.v ...
- 文件I/O实践(1) --基础API
什么是I/O 输入/输出是内存和外设之间拷贝数据的过程: 设备->内存: 输入操作 内存->设备: 输出操作 高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲 ...
- [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景
下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...
- Linux下恢复误删文件:思路+实践
周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到Dave Chinner在邮件列表里提到了这个问题, ...
- Linux文件权限与文件夹权限实践
文件权限在基础中有介绍,不在重复 一.文件夹权限: 示例: 解释说明: r --read 既ls w --write 既创建新的目录或者文件 x --execute 既cd 现在有4个用户分属 ...
随机推荐
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- PHP If...Else 语句
PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...
- java 随机数高效生成
分享牛,分享牛原创.近期去面试经常被问到java如何生产随机数,以及生成很大的字符串保证不能重复,还要考虑性能,之前本人面试别人的时候,可能不会问这个问题.既然这个java随机数问题经常被问到,那咱们 ...
- Gradle 1.12用户指南翻译——第五十二章. Maven 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...
- DoesNotExist at /admin/
DoesNotExist at /admin/ User has no account. Request Method: GET Request URL: http://127.0.0.1:8000/ ...
- lucene索引库的增删改查操作
1. 索引库的操作 保持数据库与索引库的同步 说明:在一个系统中,如果索引功能存在,那么数据库和索引库应该是同时存在的.这个时候需要保证索引库的数据和数据库中的数据保持一致性.可以在对数据库进行增.删 ...
- [supervisor] 使用小记(入门教程)
之前到现在很久没有用了,还是从安装说下,做个简单的实验,系统为Ubuntu14.04 快速安装配置 sudo pip_python install supervisor sudo echo_super ...
- springMVC系列之(四) spring+springMVC+hibernate 三大框架整合
首先我们要知道Hibernate五大对象:,本实例通过深入的使用这五大对象和spring+springMVC相互结合,体会到框架的好处,提高我们的开发效率 Hibernate有五大核心接口,分别是:S ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- 11 PopupMenu菜单和代码例子
PopupMenu 弹出式菜单 API 11以上可用 1. 获取弹出菜单的对象 2. 在res里的menu添加菜单项 3. 将布局里的菜单项 给弹出菜单 4. 进行监听弹出菜单 5. 展示出弹出菜单 ...