dirent struct_file属性读取 Struct dirent struct stat

文件信息获取操作

Struct __dirstream

{

void *__fd

char *__data;

int __entry_data;

char *__ptr;

int __entry_ptr;

size_t __allocation;

size_t __size;

__libc_lock_define(,__lock);

}

typedef struct __dirstream DIR;

Struct dirent

{

long d_ino; //inode number

off_t d_off; //offset to this dirent

unsigned short d_reclen; //length of this d_name

unsigned char d_type; //the type of d_name

char d_name[NAME_MAX+1]; //file name

}

//具体定义在/usr/include/bits/stat.h stat64和stat有点区别

struct stat {

dev_t         st_dev;      /* device */

ino_t         st_ino;      /* inode */

mode_t        st_mode;     /* protection */

nlink_t       st_nlink;    /* number of hard links */

uid_t         st_uid;      /* user ID of owner */

gid_t         st_gid;      /* group ID of owner */

dev_t         st_rdev;     /* device type (if inode device) */

off_t         st_size;     /* total size, in bytes */

blksize_t     st_blksize;  /* blocksize for filesystem I/O */

blkcnt_t      st_blocks;   /* number of 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 */

};

其中,st_mode的类型 mode_t.

mode_t其实就是普通的unsigned int.

目前,st_mode使用了其低19bit. 0170000 => 1+ 3*5 = 16.

其中,最低的9位(0-8)是权限,9-11是id,12-15是类型。

具体定义如下:

S_IFMT     0170000   bitmask for the file type bitfields

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 UID bit

S_ISGID    0002000   set GID 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 permisson

S_IXOTH    00001     others have execute permission

文件类型:

d目录文件         - 普通文件

l 链接             b 块设备文件

p 管道文件         c 字符设备文件

s 套接口文件

文件权限:

[0-2]所有者权限,[3-5]所有者同一组用户权,[6-8]其它用户权限

DIR* opendir (const char * path ); //get a dir handler

struct dirent* readdir(DIR* dir_handle);//read dir

代码:

/****************************************************************************

*create time :2014-11-26

*function :use for read file or dir info

*author: JHK

*version: 0.0.01

******************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include"prin.h"  //实现了prin_info函数

#define PATH "/jhk/test"

typedef struct

{

char f_mode;

char limits[10];

int own;

int group;

long f_len;

char l_modify[32];

char f_name[32];

}FileInfo;

static int analysis_stmode(unsigned int mode,FileInfo *pf_info);

int main(void)

{

DIR *dir=NULL;

struct dirent *pdirent;

struct stat64 StatBuf;

char filepath[255];

FileInfo pf_info;

struct tm * t;

dir = opendir(PATH);  //get dir handler

if(dir == NULL)

{

prin_info("opendir error:%s",strerror(errno));

return ERR;

}

while((pdirent = readdir(dir))!=NULL)//read dir

{

if( strcmp( pdirent->d_name, "." ) == 0  ||

strcmp( pdirent->d_name, ".." ) == 0 )

{

continue;

}

sprintf(filepath,"%s/%s",PATH,pdirent->d_name);

if(stat64(filepath,&StatBuf) !=0 )

{

prin_info("stat failed :%s",strerror(errno));

return ERR;

}

analysis_stmode(StatBuf.st_mode,&pf_info);

//ID  /etc/group

pf_info.own=StatBuf.st_uid;

pf_info.group=StatBuf.st_gid;

//file length

pf_info.f_len=StatBuf.st_size;

//last modify time

t = localtime ( &StatBuf.st_mtime );

sprintf(pf_info.l_modify,"%d-%d-%d %d:%d:%d",t->tm_year+1900,t->tm_mon,t->tm_mday,

t->tm_hour,t->tm_min,t->tm_sec);

//file name

sprintf(pf_info.f_name,"%s",pdirent->d_name);

prin_info("%c%s%3d%3d %10d %s %s",pf_info.f_mode,pf_info.limits,pf_info.own,pf_info.group,

pf_info.f_len,pf_info.l_modify,pf_info.f_name);

}

return 0;

}

static int analysis_stmode(unsigned int mode,FileInfo *pf_info)

{

int i=0;

/*file  mode&0x0040000==1 id a directory*/

if(S_ISREG(mode)) //S_IFMT     0170000   bitmask for the file type bitfields

pf_info->f_mode = '-';

else if(S_ISDIR(mode))  //S_IFDIR    0040000   directory

pf_info->f_mode = 'd';

else if(S_ISCHR(mode)) // S_IFCHR    0020000   character device

pf_info->f_mode = 'c';

else if(S_ISBLK(mode)) //S_IFBLK    0060000   block device

pf_info->f_mode = 'b';

else if(S_ISFIFO(mode))//S_IFREG    0100000   regular file

pf_info->f_mode = 'p';

else if(S_ISLNK(mode)) //S_IFLNK    0120000   symbolic link

pf_info->f_mode = 'l';

else if(S_ISSOCK(mode))//S_IFSOCK   0140000   socket

pf_info->f_mode = 's';

else

prin_info("f_mode error!");

/*file limits[0-2]own,[3-5]own's group,[6-8]others*/   strcpy(pf_info->limits,"rwxrwxrwx");   for(i=8;i>=0;i--)   {   if((mode&(1<limits[8-i]='-';   }     return OK; }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值