linux编程stat检测文件元数据信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #define ERR_EXIT( m ) \ do \ { \ perror ( m ); \ exit ( EXIT_FAILURE ); \ } while ( 0 ) #define MAJOR( a ) (int)((unsigned short)a >> 8 ) //获取高8位 #define MINOR( a ) (int)((unsigned short)a & 0xFF ) //获取低8位 //检测文件类型 int filetype( struct stat* st, char * filetype ); //检测文件权限 void fileperm( struct stat* st, char * perm ); int main( int argc, char * argv[] ) { int ret; if ( argc != 2 ) { fprintf ( stderr, "usage:%s filename\n" , argv[0] ); exit ( EXIT_FAILURE ); } struct stat st; ret = stat( argv[1], &st ); if ( -1 == ret ) { ERR_EXIT( "stat file error" ); } printf ( "文件大小:st_size=%d\n" , st.st_size ); printf ( "用户id:uid=%d\n" , st.st_uid ); printf ( "组id:gid=%d\n" , st.st_gid ); //printf( "主设备号:major_dev=%d\n", MAJOR( st.st_dev ) ); //printf( "次设备号:minor_dev=%d\n", MINOR( st.st_dev ) ); printf ( "i节点:st_ino=%d\n" , st.st_ino ); char filetypestr[64] = { 0 }; int ftype = filetype( &st, filetypestr ); if ( ftype == 3 || ftype == 5 ) { printf ( "文件类型:%s\n" , filetypestr ); printf ( "主设备号:%d, 次设备号:%d\n" , MAJOR( st.st_dev ), MINOR( st.st_dev ) ); } else { printf ( "文件类型:%s\n" , filetypestr ); } char perm[11]; fileperm( &st, perm ); printf ( "文件权限:%o, %s\n" , st.st_mode & 07777, perm ); return 0; } //检测文件类型,设置文件返回1 其他文件返回0 /* 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 */ int filetype( struct stat* st, char * filetype ) { mode_t mode = st->st_mode; int flag = 0; char * filetypes[] = { "socket" , "symbolic link" , "regular file" , "block device" , "directory" , "character device" , "fifo" }; switch ( mode & S_IFMT ){ case S_IFSOCK: strncpy ( filetype, filetypes[0], strlen ( filetypes[0] ) ); flag = 0; break ; case S_IFLNK: strncpy ( filetype, filetypes[1], strlen ( filetypes[1] ) ); flag = 1; break ; case S_IFREG: strncpy ( filetype, filetypes[2], strlen ( filetypes[2] ) ); flag = 2; break ; case S_IFBLK: strncpy ( filetype, filetypes[3], strlen ( filetypes[3] ) ); flag = 3; break ; case S_IFDIR: strncpy ( filetype, filetypes[4], strlen ( filetypes[4] ) ); flag = 4; break ; case S_IFCHR: strncpy ( filetype, filetypes[5], strlen ( filetypes[5] ) ); flag = 5; break ; case S_IFIFO: strncpy ( filetype, filetypes[6], strlen ( filetypes[6] ) ); flag = 6; break ; } return flag; } //检测文件权限 /* 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 */ void fileperm( struct stat* st, char * perm ) { strncpy ( perm, "----------" , 10 ); perm[0] = '?' ; mode_t mode = st->st_mode; char typestr[64] = { 0 }; char * abbreviation[] = { "s" , //socket "l" , //symbolic link "-" , //regular file "b" , //block file "d" , //directory "c" , //charactor device "p" //fifo }; int ret = filetype( st, typestr ); strncpy ( perm, abbreviation[ret], 1 ); //检测文件所属的用户权限 if ( mode & S_IRUSR ){ perm[1] = 'r' ; } if ( mode & S_IWUSR ){ perm[2] = 'w' ; } if ( mode & S_IXUSR ){ perm[3] = 'x' ; } //检测用户组权限 if ( mode & S_IRGRP ){ perm[4] = 'r' ; } if ( mode & S_IWGRP ){ perm[5] = 'w' ; } if ( mode & S_IXGRP ){ perm[6] = 'x' ; } //检测其他组权限 if ( mode & S_IROTH ){ perm[7] = 'r' ; } if ( mode & S_IWOTH ){ perm[8] = 'w' ; } if ( mode & S_IXOTH ){ perm[9] = 'x' ; } perm[10] = '\0' ; } |
作者:ghostwu, 出处:http://www.cnblogs.com/ghostwu
博客大多数文章均属原创,欢迎转载,且在文章页面明显位置给出原文连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架