当前的工作目录

时间:2011-12-10 21:49:31

标签: c traversal

我目前正在构建一些遍历所有文件和路径以及文件大小的Directorys代码。我现在卡在遍历过程的最后一部分,这是使代码进入任何遇到的目录的if语句。

do {
    char *filename = entry->d_name;
    stat(filename,&buffer);
    if (S_ISDIR(buffer.st_mode)) {
        name = entry->d_name;
        chdir(name);
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
            continue;
        listdir(name);     //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM!
        chdir("..");
    }
    else
        printf("%s\t%d\n", entry->d_name,buffer.st_size);

我很困惑,试图让它进入它遇到的目录!哎呀!

3 个答案:

答案 0 :(得分:1)

问题是,当我执行时,stat()失败了。

这对我有用:

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

void listdir(const char* const name);

int main(void)
{
    listdir(getenv("PWD"));
    return 0;
}

void listdir(const char* const name)
{
    DIR *dir;
    struct dirent *entry;
    struct stat buffer;
    char* path = 0;

    if (!(dir = opendir(name)))
        return;
    if (!(entry = readdir(dir)))
        return;

    do {
        path =
            malloc((strlen(name) + strlen(entry->d_name) + 2) * sizeof(char));
        sprintf(path, "%s/%s", name, entry->d_name);

        if (-1 == stat(path,&buffer))
        {
            fprintf(stderr, "stat(%s) failed: %s\n",
                path, strerror(errno));
            exit(1);
        }
        else if (S_ISDIR(buffer.st_mode))
        {
            if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
            {
                listdir(path);
            }
        }
        else
        {
            printf("%s\t%d\n", path, buffer.st_size);
        }
        free(path);
    } while (entry = readdir(dir));
    closedir(dir);
}

编辑:

删除了对chdir()的调用,因为意识到它是多余的。这确实提供了列表,但没有使用chdir()

答案 1 :(得分:0)

首先,您应该使用lstat。其次,通过chdir(name)来电,您实际上进入父指令(当名称=&#34; ..&#34;)时,但永远不会退缩。

答案 2 :(得分:0)

问题在于此代码:

if (S_ISDIR(buffer.st_mode)) {
    name = entry->d_name;
    chdir(name);
    if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
        continue;
    listdir(name);     //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM!
    chdir("..");
}

这是嵌入在do-while循环中,但是你没有告诉我们如何读取目录条目。

在执行strcmp()之前,chdir()条件应该应用于当前目录;这是一个“危险”的行动。当您确定需要处理目录时,可以执行chdir(),打开新的目录流,并处理新流中的条目 - 这可能是递归调用,然后是{{1} } 再次回来。完成chdir()之后的跳跃(因为在执行chdir(..)之前没有检查..)会对事情造成严重破坏。

你应该查找chdir(name),这可能会更好,以便回到你开始的地方。