文件I/O实践(2)

功能:获取文件元数据

#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_tst_dev;/* ID of device containing file */ino_tst_ino;/* inode number */mode_t st_mode; /* protection */nlink_t st_nlink; /* number of hard links */uid_tst_uid;/* user ID of owner */gid_tst_gid;/* group ID of owner */dev_tst_rdev; /* device ID (if special file) */off_tst_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;}//获取文件的权限: 但要注意需要&上07777fprintf(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 */};而现在我喜欢深邃的夜空,包容一切的黑暗和隐忍,留下眼泪也没人看见。

文件I/O实践(2)

相关文章:

你感兴趣的文章:

标签云: