列出文件名和属性——实现一个简单的ls命令

来源:互联网 发布:网络信息交流 编辑:程序博客网 时间:2024/05/18 22:43

1.Linux(Unix)目录树的结构
目录和普通文件是Linux环境下两种常见的文件,其中目录的内容是子目录和文件的名字,(从组织结构来看,目录和windows下的文件夹有些类似)

2.ls命令的作用
ls命令即列出当前目录下的文件和子目录(其他带参形式请参考联机帮助)
3.ls的工作原理
目录是一种特殊的文件类型,因此,是否可以通过类似于 打开文件获得句柄->系统调用操作句柄->显示信息->关闭 的方式来实现ls呢?
答案是肯定的。
对于目录这种特殊的文件类型,使用系统调用opendir来打开,readdir来获取,closedir来关闭。
其中,readdir返回一个指向目录的当前记录的指针,记录的类型是struct dirent,结构定义如下:
struct direct
{
ino_t d_io;
off_t d_off;
unsigned d_reclen;
char d_name[NAME_MAX+1]; /*文件名*/
}
所以,ls的基本原理就是循环读取direct的内容(名字),然后输出。
4.文件信息的获取
文件的属性,如大小,文件所有者的ID,等,都存放在结构struct stat里,故要获得属性,可以打印stat结构体里的信息。
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量

};
5.ls简单实现的代码、


说明:这里的代码只实现了最简单的功能,其中时间,文件所有者的ID等格式未进行转换。

 

原创粉丝点击