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

#include

#include

#include

#include

#include

#include

#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] = ' ';

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值