readdir一般与opendir结合使用。
readdir包含的头文件: #include <dirent.h>
readdir函数的原型: struct dirent *readdir(DIR *dirp);
函数的作用是:返回一个指向dirp所指向的目录流下一个目录条目的dirent结构的指针。它返回
当到达目录流的末尾或发生错误时为NULL。
在Linux上,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 supportedby all filesystem types */
char d_name[256]; /* filename */
};
返回值
成功后,readdir()返回指向dirent结构的指针。(此结构可以静态分配;不要试图释放它。如果
到达目录流,返回NULL,不更改errno。如果发生错误,则返回NULL,并适当地设置errno。
#include<stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
int main(int argc,char**argv)
{
DIR *pth = NULL;
struct dirent *dr = NULL;
unsigned int cnt =0;
if(argc!=2)
{
printf("使用 %s pathname\n",argv[0]);
}
pth = opendir(argv[1]);
if(NULL==pth)
{
perror("opendir:");
}
while(1)
{
dr = readdir(pth); //一直循环读取子文件,调用时文件标识符绑定不会重复,所以不会重复读取相同的子文件
if(dr!=NULL)
{
printf("dr->d_name=%s\n",dr->d_name);
cnt++;
}
if(dr ==NULL)
{
break;
}
}
printf("总文件数为:%d\n", cnt);
return 0;
}
通过argv[1]将文件目录传进去,./a.out ./ 的执行结果:
dr->d_name=.
dr->d_name=..
dr->d_name=a.out
dr->d_name=add.c
dr->d_name=case
dr->d_name=define_test.c
dr->d_name=file
dr->d_name=gettimeofday.c
dr->d_name=lib
dr->d_name=memcpy.c
dr->d_name=net
dr->d_name=pipe
dr->d_name=puts.c
dr->d_name=readir
dr->d_name=resgister.c
dr->d_name=return-1.c
dr->d_name=return_case.c
dr->d_name=string.c
dr->d_name=struct.c
dr->d_name=test
dr->d_name=test.c
dr->d_name=time.c
dr->d_name=weiyu.c
dr->d_name=yuan.c
总文件数为:24