ubuntu 14.04.2
ls命令用来读取目录,工作方式如下:
open directory
read directory -end of dir?
display file info |
close directory<———————
与普通文件不同的是,目录文件永远不为空。每个目录至少包含两个特殊的项‘.’和‘..’,其中’.’代表当前目录,‘..’代表上一级目录。因此,”cd ..”命令会返回上一级目录。
如何读取目录内容?
readdir函数
使用man readdir命令可以看到,这个函数在dirent.h里面声明(user/include/dirent.h),用来读取目录中的记录,返回一个指向当前目录记录的指针struct dirent* ,这个结构体具体是:
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all filesystem types */
char d_name[256]; /* filename */
};
其中,d_name用来存放文件名,有了它我们就可以编写简单的ls命令,读取当前目录下的文件名了。具体过程与从文件读取数据类似,opendir打开一个目录,readdir读取内容,closedir关闭目录
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
void do_ls(char[]);
main(int ac,char* av[])
{
if(ac == 1)
do_ls(".");
else
while( --ac){
printf("%s:\n",* ++av);
do_ls( *av);
}
}
void do_ls(char dirname[])
{
DIR* dir_ptr;
struct dirent* direntp;
if((dir_ptr = opendir(dirname)) == NULL)
fprintf(stderr,"ls1:cannot open % s\n",dirname);
else
{
while((direntp = readdir(dir_ptr))!=NULL)
printf("%s\n",direntp -> d_name);
closedir(dir_ptr);
}
}
参考文献 《Linux/unix编程实践教程》