该程序在根级别打印目录
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;
}
现在,我知道有些人在提出他们认为我希望他们编码的问题时会感到恼火,你不需要,如果你能从理论上告诉我我需要做什么......我会研究它,尽管如果它一个小的编程修复,你可以发布我真的应用它...但如果没有..我也很想知道需要用文字做什么..
谢谢
答案 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工作得很好。