基础:
目录(directory)是文件的列表,目录里面有很多记录(dirent),记录可以是文件/子目录
readdir函数可以读取目录中的记录,并且返回指向目录当前记录的指针
记录(dirent)的结构体定义如下
- 系统在某个不为人知的地方define了DIR为 directory
- readdir , closedir 函数都传入directory的指针
- 目录不会为空,至少有自己,所以当ac(接受的目录的大小)为1的时候,我们需要显示出自己
首先我们来想想这个是怎么实现的
- 打开一个directory
- 一直读它,边读边输出,直到读完为止
- 关闭directory
伪代码:
main()
opendir
while ( readdir )
print d_name
closedir
分析一下需要传入的参数
- int ac : dir中的记录的个数
- char * av[] 各个记录
do_ls 函数
//之前在系统不知道什么地方define了DIR为 dirrect
void do_ls(char dirname[]){
DIR *dir_ptr;
struct dirent * direntp; //dirent -pointer
// read dirptr failed
if( (dir_ptr = opendir ( dirname) ) == NULL)
fprintf( ( stderr , " ls1 : cannot open %s\n" dirname);
else {
while ( ( direntp = read( readdir ( dir_ptr )) != NULL )
printf("%s \n" ,direntp -> d_name);
closedir(dir_ptr);
}
}
主函数
main(int ac, char * av[]){
if( ac ==1 )
do_ls(".");
else
while( --ac ){
printf("%s :\n" ,* ++av);
do_ls(*av);
}
}
源代码:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <dirent.h>
4
5 void do_ls(char[]);
6
7 main(int ac, char * av[]){
8 if( ac ==1 )
9 do_ls(".");
10 else
11 while( --ac ){
12 printf("%s :\n" ,* ++av);
13 do_ls(*av);
14 }
15 }
16
17 /*lisr files in directory called dirname*/
18 void do_ls(char dirname[]){
19 DIR *dir_ptr;
20 struct dirent * direntp; //dirent -pointer
21 // read dirptr failed
22 if( (dir_ptr = opendir ( dirname) ) == NULL)
23 fprintf ( stderr , " ls1 : cannot open %s\n", dirname);
24 else {
25 while ( direntp = read( readdir ( dir_ptr )) != NULL )
26 printf("%s \n" ,direntp -> d_name);
27 closedir(dir_ptr);
28 }
29 }