由于偷懒,第一次写博客,先写个简单的吧 (~o ̄3 ̄)~
有不对的地方希望指正 ((*・∀・)ゞ→→
最近在写ls命令时有涉及到这一部分,怎样将 通过获取文件属性函数 ---- stat 所获得的东西
转换成我们在Shell下输入“ls -l”所得到的样子,就是这样的:
那么,我们一步一步的来:
1.首先是先调用stat函数获得该文件或者目录信息
不要忘记头文件 ヾ(≧O≦)〃
#include
#include
#include
#include
#include
struct stat buf;
if(stat(file_name,&buf)==-1)
{
my_err("stat",__LINE__);
}
buf 这个结构体里就存的是file_name这个目录的信息啦!
这个my_eer是自己定义的报错函数,可以有效查找在哪里出的错(在后面的全部代码里会有)
关于stat结构体里的东西
Linux是这样定义的:
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //文件的i-node节点号
mode_t st_mode; //文件的类型和存储权限
nlink_t st_nlink; //连到该文件的硬链接数目
uid_t st_uid; //文件所有者用户ID
gid_t st_gid; //文件所有者的组ID
dev_t st_rdev; //若此文件为设备文件,则为其编号设备
off_t st_size; //文件大小
blksize_t st_blksize; //文件系统的I/O缓冲区大小
blkcnt_t st_blocks; //占用文件区块的个数
time_t st_atime; //文件最近一次被访问的时间
time_t st_mtime; //文件最近一次被修改的时间
time_t st_ctime; //文件最近一次被更改的时间(文件所有者,所属组,文件权限被更改时)
};
2.然后开始解析结构体里的内容,将它们转换为我们需要的东西,首先是文件类型信息:
对于st_mode包含的文件信息,POSIX标准定义了一系列的宏。
是这样定义的:
S_ISLNK(st_mode) 判断是否位符号链接
S_ISREG(st_mode) 判断是否为一般文件
S_ISDIR(st_mode) 判断是否为目录文件
S_ISCHR(st_mode) 判断是否为字符设备文件
S_ISBLK(st_mode) 判断是否为块设备文件
S_ISFIFO(st_mode) 判断是否为先进先出FIFO
S_ISSOCK(st_mode) 判断是否为socket
那么我们就可以这样实现: (。・∀・)ノ゙
if(S_ISLNK(buf.st_mode))
printf("l");
else if(S_ISREG(buf.st_mode))
printf("-");
else if(S_ISDIR(buf.st_mode))
printf("d");
else if(S_ISCHR(buf.st_mode))
printf("c");
else if(S_ISBLK(buf.st_mode))
printf("b");
else if(S_ISFIFO(buf.st_mode))
printf("f");
else if(S_ISSOCK(buf.st_mode))
printf("s");
3.然后是下一个存取权限
Linux是这样定义的:
S_IRUSR 00400 文件所有者具可读取权限
S_IWUSR 00200 文件所有者具可写入权限
S_IXUSR 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
我们也可以按照上面的做法,一个一个对比,比如:
if(buf.st_mode & S_IRUSR)
printf("r");
但是我觉得太麻烦了~~~
得写9个呢 ~Σ(っ °Д °;)っ
而且敲那些大写字母,真的是又记不住,又容易错!!! (@_@;)
所以我是这个样子实现滴~
我们都知道,权限一般可以表示为数字,比如 742 就是 rwx r-- -x- ,但是在 buf 的 st_mode 中,是以八进制来表示的,没关系,一样用!!而且非常简单!
看下一篇~~~