• linux编程stat检测文件元数据信息


    #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
    ", 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
    ", st.st_size );
            printf( "用户id:uid=%d
    ", st.st_uid );
            printf( "组id:gid=%d
    ", st.st_gid );
            //printf( "主设备号:major_dev=%d
    ", MAJOR( st.st_dev ) );
            //printf( "次设备号:minor_dev=%d
    ", MINOR( st.st_dev ) );
            printf( "i节点:st_ino=%d
    ", st.st_ino );
    
            char filetypestr[64] = { 0 };
            int ftype = filetype( &st, filetypestr );
            if( ftype == 3 || ftype == 5 ) {
                    printf( "文件类型:%s
    ", filetypestr );
                    printf( "主设备号:%d, 次设备号:%d
    ", MAJOR( st.st_dev ), MINOR( st.st_dev ) );
            }else {
                    printf( "文件类型:%s
    ", filetypestr );
            }
    
            char perm[11];
            fileperm( &st, perm );
            printf( "文件权限:%o, %s
    ", 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] = '';
    }
    

      

  • 相关阅读:
    P3822 [NOI2017]整数
    P4630 [APIO2018] Duathlon 铁人两项
    P3230 [HNOI2013]比赛
    P2570 [ZJOI2010]贪吃的老鼠
    P4576 [CQOI2013]棋盘游戏
    P3256 [JLOI2013]赛车
    P3297 [SDOI2013]逃考
    CF487E Tourists
    设置一个双色球脚本(2)并带颜色输出
    设置一个双色球脚本
  • 原文地址:https://www.cnblogs.com/ghostwu/p/10983301.html
Copyright © 2020-2023  润新知