获取文件的信息stat() lstat() fstat()
来源:互联网 发布:mac制作黑苹果安装u盘 编辑:程序博客网 时间:2024/06/07 12:49
获取文件的信息 stat()利用系统调用stat(),lstat(),fstat()可获取与文件有关的信息,其中大部分提取自文件i节点。 #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区别在于,如果文件属于符号链接,那么所返回的信息针对的是符号链接自身而非指向的文件。 系统调用stat()和lstat()无需对所操作的文件本身拥有任何权限,但针对指定的pathname父目录要有 执行(搜索)权限。而只要有有效的文件描述符,fstat()系统调用总是成功。 以上所有系统调用都会在缓冲区中返回一个由startbuf指向的stat结构,其格式如下: struct stat { dev_t st_dev; /* ID of device containing file */ //st_dev字段标识文件所驻留的设备 ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ //st_mode字段内含有位掩码,起标识文件类型和指定文件权限双重作用 // | | | | U | G | T | R | W | X | R | W | X | R | W | X | // <-------> <----------------------------------------------> // 文件类型 权限 (用户、组、其他) //与常量S_IFMT相与&,可以从该字段中取出文件类型 nlink_t st_nlink; /* number of hard links */ //标识了文件的硬连接数 uid_t st_uid; /* user ID of owner */ //标识文件的属主i 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 */ //st_blksize并非底层文件系统的块大小,而是针对文件系统上文件进行io操作时最优块的大小。 blkcnt_t st_blocks; /* number of 512B blocks allocated */ //表示分配给文件的总块数,块大小为512字节,其中包括了为指针块所分配的空间 //实际分配给文件的磁盘块的数量 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 */ //文件状态发生变化的时间 }; 针对stat结构中的st_mode来检查文件类型的宏: 常量 测试宏 文件类型 S_IFREG S_IFREG() 常规文件 S_IFDIR S_IFDIR() 目录 S_IFCHR S_IFCHR() 字符设备 S_IFBLK S_IFBLK() 块设备 S_IFIFO S_IFIFO() FIFO或管道 S_IFSOCK S_IFSOCK() 套接字 S_IFLNK S_ISLNK() 符号链接 判断文件的类型: if ((statbuf.st_mode & S_IFMT) == S_IFREG) printf("regular file\n"); 等价于: if (S_ISREG(statbuf.st_mode)) printf("regular file\n"); S_IFMT 0170000 bit mask for the file type bit fields S_IFSOCK 0140000 socket S_IFLNK 0120000 symbolic link S_IFREG 0100000 regular file S_IFBLK 0060000 block device S_IFDIR 0040000 directory S_IFCHR 0020000 character device S_IFIFO 0010000 FIFO S_ISUID 0004000 set-user-ID bit S_ISGID 0002000 set-group-ID bit (see below) S_ISVTX 0001000 sticky bit (see below) S_IRWXU 00700 mask for file owner permissions S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner has write permission S_IXUSR 00100 owner has execute permission S_IRWXG 00070 mask for group permissions S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 mask for permissions for others (not in group) S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission 1 #include <unistd.h> 2 #include <stdio.h> 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <time.h> 6 int main(int agrc,char * argv[]){ 7 struct stat sb; 8 struct passwd * pwd; 9 if (stat(argv[1],&sb)==-1) { 10 printf("按照以下格式输入:%s filename\n",argv[0]); 11 exit(-1); 12 } 13 printf("文件类型:"); 14 switch(sb.st_mode & S_IFMT){ 15 case S_IFREG: printf("普通文件"); break; 16 case S_IFDIR: printf("目录"); break; 17 case S_IFCHR: printf("字符设备"); break; 18 case S_IFBLK: printf("块设备"); break; 19 case S_IFIFO: printf("FIFO或管道"); break; 20 case S_IFSOCK: printf("套接字"); break; 21 case S_IFLNK: printf("符号链接");break; 22 default: printf("未知文件类型");break; 23 } 24 printf("\n"); 25 printf("%s的硬连接数为:%d\n",argv[1],sb.st_nlink); 26 printf("%s的inode节点为:%d\n",argv[1],sb.st_ino); 27 printf("%s的文件属主为:%d\n",argv[1],sb.st_uid); 28 printf("%s的文件属组为:%d\n",argv[1],sb.st_gid); 29 printf("%s的文件大小为:%d\n",argv[1],sb.st_size); 30 printf("%s的分配文件总块数为:%d\n",argv[1],sb.st_blocks); 31 printf("%s的上次访问时间为:%s",argv[1],ctime(&sb.st_atime)); 32 printf("%s的上次修改时间为:%s",argv[1],ctime(&sb.st_mtime)); 33 printf("%s的上次文件状态变化时间为:%s",argv[1],ctime(&sb.st_ctime)); 34 return 0; 35 } songxl@ubuntu:~/linuxc/manual$ stat copy 文件:"copy" 大小:7637 块:16 IO 块:4096 普通文件设备:801h/2049dInode:280675 硬链接:1权限:(0775/-rwxrwxr-x) Uid:( 1000/ songxl) Gid:( 1000/ songxl)最近访问:2015-05-21 19:15:49.094183660 +0800最近更改:2015-05-21 19:15:33.002184218 +0800最近改动:2015-05-21 19:15:33.002184218 +0800创建时间:-songxl@ubuntu:~/linuxc/manual$ a.out copy文件类型:普通文件copy的硬连接数为:1copy的inode节点为:280675copy的文件属主为:1000copy的文件属组为:1000copy的文件大小为:7637copy的分配文件总块数为:16copy的上次访问时间为:Thu May 21 19:15:49 2015copy的上次修改时间为:Thu May 21 19:15:33 2015copy的上次文件状态变化时间为:Thu May 21 19:15:33 2015songxl@ubuntu:~/linuxc/manual$
0 0
- 获取文件的信息stat() lstat() fstat()
- 获取文件信息(fstat、stat和lstat 区别)
- UNIX - stat、fstat和lstat函数,获取文件信息结构
- fstat lstat stat的用法
- 获取文件属性—stat、lstat、fstat
- 函数stat,lstat,fstat的使用
- fstat、stat和lstat的区别
- stat,lstat,fstat三者的区别
- stat,lstat,fstat三者的区别
- fstat/stat/lstat
- stat/fstat/lstat函数
- fstat stat lstat
- stat, fstat, lstat 函数
- stat/fstat/lstat 区别
- stat、fstat、lstat函数
- stat/fstat/lstat函数
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- java 获取当期时间之前几小时的时间
- Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
- ARCGIS Engine EXE程序 执行不了 不能弹出主界面
- 如何获得人脸特征点坐标
- 优化UITableViewCell高度计算的那些事
- 获取文件的信息stat() lstat() fstat()
- spring拦截器的使用
- Datatables之Server-side(服务器模式)
- ajax 重复提交
- 《编程珠玑》阅读小记(5) — 编程小事
- Memcache缓存数据库
- 接口调用方法
- 《大话设计模式》--老板回来,我不知道--观察者模式<Observer>(14)
- 实际中遇到的JSON与JAVA的转换问题