头文件:
#include <sys/types.h>
#include <dirent.h>
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];
};
d_type枚举类型
{
DT_BLK This is a block device.
DT_CHR This is a character device.
DT_DIR This is a directory.
DT_FIFO This is a named pipe (FIFO).
DT_LNK This is a symbolic link.
DT_REG This is a regular file.
DT_SOCK This is a UNIX domain socket.
DT_UNKNOWN The file type is unknown.
}
范例:
void TraverseDir(char *direntName, int level)
{
//定义一个目录流指针
DIR *p_dir = NULL;
//定义一个目录结构体指针
struct dirent *p_dirent = NULL;
//打开目录,返回一个目录流指针指向第一个目录项
p_dir = opendir(direntName);
if(p_dir == NULL)
{
printf("opendir error\n");
}
//循环读取每个目录项, 当返回NULL时读取完毕
while((p_dirent = readdir(p_dir)) != NULL)
{
//备份之前的目录名
char *backupDirName = NULL;
if(p_dirent->d_name[0] == '.' || p_dirent->d_name[0] == '..')
{
continue;
}
int i;
for(i = 0; i < level; i++)
{
printf("|");
printf(" ");
}
printf("|--- ");
printf("%s\n", p_dirent->d_name);
//如果目录项仍是一个目录的话,进入目录
if(p_dirent->d_type == DT_DIR)
{
//当前目录长度
int curDirentNameLen = strlen(direntName)+strlen(p_dirent->d_name) + 2;
//准备下一级
backupDirName = (char *)malloc(curDirentNameLen);
memset(backupDirName, 0, curDirentNameLen);
memcpy(backupDirName, direntName, curDirentNameLen);
strcat(backupDirName, "/");
strcat(backupDirName, p_dirent->d_name);
PrintDirentStruct(backupDirName, level + 1);//递归调用
free(backupDirName);
backupDirName = NULL;
}
}
closedir(p_dir);
}
int main(int argc,char **argv)
{
if (argc < 2)
{
printf("please input dir name\n");
return -1;
}
TraverseDir(argv[1], 0);
return 0;
}
运行结果: