可以调用 dirent.h 中的scandir函数扫描指定目录中所有的文件名
如下,用了一个队列先进先出保存每一级的目录,while循环,无需递归,需要把.和..目录过滤
#include
#include
#include
#include
#include
using namespace std;
void scandir_recursive(const char* szDir)
{
queue queDir;
char *temp = new char[NAME_MAX + 1];
strncpy(temp, szDir, NAME_MAX);
queDir.push(temp);
while(!queDir.empty())
{
char *tempdir = queDir.front();
queDir.pop();
struct dirent **namelist;
struct stat state;
int n = scandir(tempdir, &namelist, NULL, alphasort);
char new_path[ NAME_MAX + 1 ] = {0};
if(n < 0)
perror("error\n");
else
{
int itemp = 0;
printf("directory:%s\n",tempdir);
for(int i = 0;i < n;i++)
{
bool bisdirectory = false;
if(strcmp(namelist[i]->d_name,".") == 0 || strcmp(namelist[i]->d_name,"..") == 0)
continue;
if(itemp++%5 == 0)
printf("\n");
snprintf(new_path, sizeof(new_path),"%s/%s",tempdir, namelist[i]->d_name);
stat(new_path,&state);
if(state.st_mode & S_IFDIR)
{
printf("[DIR]");
strcat(new_path,"/");
char *temp = new char[NAME_MAX + 1];
strncpy(temp,new_path, NAME_MAX);
queDir.push(temp);
bisdirectory = true;
}
if(bisdirectory)
printf("%25s",namelist[i]->d_name);
else
printf("%30s",namelist[i]->d_name);
}
printf("\n\n");
}
delete []tempdir;
}
}
int main()
{
scandir_recursive("/d1");
exit(EXIT_SUCCESS);
}