使用c ++打印所有目录

时间:2011-10-02 20:50:58

标签: c++

该程序在根级别打印目录

Directory_1
Directory_2

但我希望能够在其中打印目录

Directory_1
   Directory_1_2
   Directory_1_3
Directory_2
   Directory 2_1
      Directory_2_1_1
Directory_4

我试图以递归方式执行此操作,但我发现很难将Directory_1作为根传递,因此会对其进行评估..我缺少什么?

这是我的输出

..
.
Directory_1
Directory_2
Failed to open directory: No such file or directory

代码

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>

char *arg_temp;

int printDepthFirst(char *arg_tmp);

int main(int argc, char *argv[]) {

   if (argc != 2) {
      fprintf(stderr, "Usage: %s directory_name\n", argv[0]);
      return 1; 
   }  


  arg_temp = argv[1]; 

  printDepthFirst(arg_temp);

}

int printDepthFirst(char *arg_tmp)
{

   struct dirent *direntp;
   DIR *dirp;

   if ((dirp = opendir(arg_tmp)) == NULL) {
      perror ("Failed to open directory");
      return 1;
   }  


   while ((direntp = readdir(dirp)) != NULL)
  {
   printf("%s\n", direntp->d_name);
   arg_tmp = direntp->d_name;
  }    
   printDepthFirst(arg_tmp);

  while ((closedir(dirp) == -1) && (errno == EINTR)) ;
     return 0;

}

现在,我知道有些人在提出他们认为我希望他们编码的问题时会感到恼火,你不需要,如果你能从理论上告诉我我需要做什么......我会研究它,尽管如果它一个小的编程修复,你可以发布我真的应用它...但如果没有..我也很想知道需要用文字做什么..

谢谢

4 个答案:

答案 0 :(得分:2)

这应该有所帮助:

#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>

static int display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)
{
    switch(tflag)
    {
        case FTW_D:
        case FTW_DP: puts(fpath); break;
    }
    return 0; /* To tell nftw() to continue */
}

int main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s directory_name\n", argv[0]);
        return 1; 
    }  

    int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS;

    if (nftw(argv[1], display_info, 20, flags) == -1)
    {
        perror("nftw");
        return 255;
    }

    return 0;
}

答案 1 :(得分:1)

查看struct dirent包含哪些字段。

答案 2 :(得分:1)

字符串 dirent :: d_name 是目录的名称,而不是它的完整路径。因此,如果您的目录“C:\ Alpha”包含目录“C:\ Alpha \ Beta”,则d_name将仅包含“Beta”,而不是“C:\ Alpha \ Beta”。你必须自己组装完整的路径 - 在你的 arg_tmp 上附加斜线/反斜杠,然后附加新的目录名,如下所示:

while ((direntp = readdir (dirp)) != NULL)
{
   char *dirname = direntp->d_name;

   // Only work with directories and avoid recursion on "." and "..":
   if (direntp->d_type != DT_DIR || !strcmp (dirname, ".") || !strcmp (dirname, "..")) continue;

   // Assemble full directory path:
   char current [strlen (arg_tmp) + 2 + strlen (dirname)];
   strcpy (current, arg_tmp);
   strcat (current, "\\"); // Replace "\\" with "/" on *nix systems
   strcat (current, dirname);

   // Show it and continue:
   printf ("%s\n", current);
   printDepthFirst (current);
}

另外,你应该在循环中递归调用,而不是在外面。

答案 3 :(得分:0)

while内的printDepthFirst循环内,您可能需要以下内容:

if(direntp->d_type == DT_DIR)
    printDepthFirst(directp->d_name);

您可能也可能不得不担心..目录。

或者,我发现boost :: filesystem工作得很好。