在linux下实现自己的ls -l

第一次写博客,想把自己一点一滴的学习过程记录下来,也当作自己的笔记吧。有疏忽错误欢迎批评指正噢!

ls -l的流程图
 

文件类型


文件访问权限

目录操作-获取当前工作路径

常用函数:getcwdget_current_dir_name
头文件:unistd.h
函数定义:
•char *getcwd(char *buf, size_t size)
•将当前的工作目录绝对路径字符串复制到参数buf 所指的缓冲区,参数size 为缓冲区大小
•若参数buf 为NULL,参数size 为0,则函数根据路径字符串的长度自动分配缓冲区,并将分配的路径字符串缓冲区指针作为函数返回值(该内存区需要手动释放
•失败返回NULL
•char *get_current_dir_name(void)
•成功返回路径字符串缓冲区指针(该内存区需要手动释放),失败返回NULL

目录操作-打开关闭目录

常用函数:opendirclosedir
头文件:dirent.h
函数定义:
•DIR * opendir(const char * name);
•打开参数name指定的目录,并使一个目录流与它关联
•目录流类似于C库函数中的文件流
•失败返回NULL
•int closedir(DIR*dir);
•关闭指定目录流,释放相关数据结构
•成功返回0;失败返回-1

目录操作-读取目录文件

常用函数:readdir
头文件:sys/types.hdirent.h
函数定义:
•struct dirent * readdir(DIR* dir);
•读取目录流标识的目录文件
•目录文件是一系列目录项的列表,每执行一次readdir,该函数返回指向当前读取目录项的指针
如果到达目录结尾或者有错误发生则返回NULL

目录操作-读取目录文件

重要数据结构

struct dirent
{
   ino_t d_ino;  i节点号
   off_t d_off;   在目录文件中的偏移
   usigned short d_reclen; 文件名长度
   unsigned char d_type;  文件类型
   char d_name[256];文件名
};

文件属性管理-读取文件属性

常用函数:statlstatfstat
头文件: sys/stat.h
函数定义:
•int stat(const char *path, struct stat *buf);
•int lstat(const char *path, struct stat *buf);
•两个函数参数相同,功能类似
•读取path参数所指定文件的文件属性并将其填充到buf参数所指向的结构体中
•对于符号链接文件,lstat返回符号链接的文件属性,stat返回符号链接引用文件的文件属性
•int fstat(int filedes, struct stat *buf);
•与前两个函数功能类似,指定文件的方式改为通过文件描述符

文件属性管理-文件属性解析

重要数据结构
struct stat {  
 mode_t    st_mode;   文件类型与访问权限 
 ino_t     st_ino;            i节点号  
 dev_t     st_dev;          文件使用的设备号  
 dev_t     st_rdev;         设备文件的设备号  
 nlink_t   st_nlink;        文件的硬链接数  
 uid_t     st_uid;            文件所有者用户ID  
 gid_t     st_gid;            文件所有者组ID  
 off_t     st_size;           文件大小(以字节为单位)  
 time_t    st_atime;       最后一次访问该文件的时间  
 time_t    st_mtime;      最后一次修改该文件的时间  
 time_t    st_ctime;       最后一次改变该文件状态的时间  
 blksize_t st_blksize;   包含该文件的磁盘块的大小  
 blkcnt_t  st_blocks;   该文件所占的磁盘块 数 
}; 

重要数据结构
mode_t st_mode;
无符号整数,其低16位定义如下


判定文件类型常用宏

•UNIX或Linux系统中的常见文件类型有:
•普通文件:  S_ISREG()
•目录文件  S_ISDIR()
•字符特殊文件  S_ISCHR()
•块特殊文件  S_ISBLK()
•FIFO文件  S_ISFIFO()
•套接口文件  S_ISSOCK()
•符号连接  S_ISLINK()

以下是实现代码:



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值