Обход дерева файловой системы - PullRequest
1 голос
/ 23 февраля 2012

Я пишу программу на C для обхода дерева файловой системы.Я знаю о ftw (), но хотел бы сделать это самостоятельно.Проблема в том, что я хотел бы, чтобы моя C-программа посещала каждый узел (каталог / файл) без необходимости выполнять pathlookup (конечно, неявно, но также избегать этого) для каждого узла.

Спасибо

Скажем, в каталоге A есть два дочерних элемента B и C. I способ добраться до каждого B и C - это прочитать содержимое C и доступ B и C с помощью пути / A /B и / A / C.Но хотел бы получить доступ к B и C без пути и непосредственно из ссылки в A

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вы можете избежать повторного поиска пути и уродства (глобального состояния и безопасности без потоков) chdir, используя openat и fdopendir вместо opendir для обхода дерева.

1 голос
/ 23 февраля 2012

Здесь:

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

void printdir(char *dir, int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    int spaces = depth*4;

    if((dp = opendir(dir)) == NULL) {
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)) {
            /* Found a directory, but ignore . and .. */
            if(strcmp(".",entry->d_name) == 0 || 
                strcmp("..",entry->d_name) == 0)
                continue;
            printf("%*s%s/\n",spaces,"",entry->d_name);
            /* Recurse at a new indent level */
            printdir(entry->d_name,depth+1);
        }
        else printf("%*s%s\n",spaces,"",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}

/*  Now we move onto the main function.  */

int main(int argc, char* argv[])
{
    char *topdir, pwd[2]=".";
    if (argc != 2)
        topdir=pwd;
    else
        topdir=argv[1];

    printf("Directory scan of %s\n",topdir);
    printdir(topdir,0);
    printf("done.\n");

    return 0;
}

Ссылка на оригинал

...