一、C语言 readdir函数用来读取指定的目录流的目录项到一个dirent结构体指针中,并将读取指针设置为下一个目录项的位置。
二、结构dirent体定义如下:
struct dirent
{
ino_t d_ino; //d_ino 此目录进入点的inode
ff_t d_off; //d_off 目录文件开头至此目录进入点的位移
signed short int d_reclen; //d_reclen _name 的长度, 不包含NULL 字符
unsigned char d_type; //d_type d_name 所指的文件类型 d_name 文件名
har d_name[256];
};
三、返回值:成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回NULL.
四、测试程序
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
/************************************************
enum
{
DT_UNKNOWN = 0, //未知类型
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = 1, //管道
# define DT_FIFO DT_FIFO
DT_CHR = 2, //字符设备
# define DT_CHR DT_CHR
DT_DIR = 4, //目录
# define DT_DIR DT_DIR
DT_BLK = 6, //块设备
# define DT_BLK DT_BLK
DT_REG = 8, //常规文件
# define DT_REG DT_REG
DT_LNK = 10, //符号链接
# define DT_LNK DT_LNK
DT_SOCK = 12, //套接字
# define DT_SOCK DT_SOCK
DT_WHT = 14 //链接
# define DT_WHT DT_WHT
};
************************************************/
int main(int argc , char* argv[])
{
DIR * dir;
struct dirent * ptr;
int i;
dir = opendir("rk3566");
while((ptr = readdir(dir)) != NULL)
{
printf("d_name : %s\n", ptr->d_name);
if (ptr->d_type == DT_REG) {//Ignore directories and only process regular files
printf("this is a regular file\n");
}
}
closedir(dir);
return 0;
}
五、运行结果,通过d_type DT_REG可以知道是目录还是常规文件。。
xxx@ubuntu-xx:~/tmp$ ls -a rk3566/
. bionic .classpath development javaenv.sh mkcombinedroot platform_testing RKDocs system vendor
.. bootable compatibility device kernel mkimage_ab.sh prebuilts rkst test
10.txt bootstrap.bash cts external libcore mkimage.sh .repo RKTools toolchain
Android.bp build dalvik frameworks libnativehelper packages restore_patches.sh rockdev tools
art build.sh developers hardware Makefile pdk rkbin sdk u-boot
xxx@ubuntu-xx:~/tmp$ gcc -o readdir_test readdir_test.c
xxx@ubuntu-xx:~/tmp$ ./readdir_test
d_name : u-boot
d_name : restore_patches.sh
this is a regular file
d_name : compatibility
d_name : prebuilts
d_name : .repo
d_name : rockdev
d_name : packages
d_name : platform_testing
d_name : Android.bp
d_name : hardware
d_name : test
d_name : system
d_name : sdk
d_name : javaenv.sh
this is a regular file
d_name : development
d_name : RKDocs
d_name : Makefile
this is a regular file
d_name : bootable
d_name : mkcombinedroot
d_name : art
d_name : frameworks
d_name : cts
d_name : rkst
d_name : bionic
d_name : dalvik
d_name : .
d_name : 10.txt
this is a regular file
d_name : .classpath
this is a regular file
d_name : ..
d_name : tools
d_name : developers
d_name : rkbin
d_name : mkimage_ab.sh
this is a regular file
d_name : mkimage.sh
this is a regular file
d_name : libnativehelper
d_name : build.sh
this is a regular file
d_name : kernel
d_name : external
d_name : toolchain
d_name : device
d_name : bootstrap.bash
d_name : pdk
d_name : RKTools
d_name : build
d_name : vendor
d_name : libcore
xxx@ubuntu-xx:~/tmp$
六、实际使用场景,解析指定目录的下的所有rc后缀的文件。
七、参考文章
版权声明:本文为qq_37858386原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。