C获取文件recursivley

时间:2015-11-08 20:44:47

标签: c file recursion printing

我试图以递归方式打印给定目录的每个文件的内容。我的代码中存在一些逻辑错误,我无法弄清楚它出错的地方。

浏览目录/子目录并获取文件名:

char filename[500], filepath[500];

void listdir(char *dir)
{
    DIR *dp;
    struct dirent *name;
    struct stat statbuf;

    if((dp = opendir(dir)) == NULL) 
    {
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
    chdir(dir);

    while((name = readdir(dp)) != NULL) 
    {
        if(lstat(name->d_name, &statbuf) == 0)
        {
            if(statbuf.st_mode & S_IFDIR)
            {
                /* Found a directory, but ignore . and .. */
                if(strcmp(".", name->d_name) == 0 || strcmp("..", name->d_name) == 0)
                    continue;

                // Directory name
                int len = strlen(filepath);
                strcat(filepath, name->d_name);
                strcat(filepath, "/");

                /* Recurse at a new indent level */
                listdir(name->d_name);

                filepath[len] = '\0';
            }
            else
            {
                // Filename
                strcpy(filename, filepath);
                strcat(filename, name->d_name);

                // Prevent double printing
                if(file[strlen(filename) - 1] != '~')
                    readFile(filename);
            }
        }
    }

    chdir("..");
    closedir(dp);
}

打开/读取文件内容:

void readFile(char *filepath)
{
    char ch;
    FILE *file;

    file = fopen(filepath, "r");

    if(file)
    {
        while((ch = fgetc(file)) != EOF)
            printf("%c", ch);

        fclose(file);
    }
}

主:

int main(int argc, int *argv[])
{
    listdir(argv[1]);
    return 0;
}

所以,如果我运行这个./fileread ~/Desktop的程序,我在桌面上有这个:

  

Songs.txt,test / test.txt,test / random.txt

它将打印出Songs.txt的内容,但不会打印出测试文件夹中的任何内容。如果我拿出"防止双重打印"然后它会打印出两次Songs.txt的内容,但仍然不会打印出测试文件夹中的任何内容。

我做错了什么?任何帮助,将不胜感激!

已更新

我添加了本地字符串:

void getdir(char *dir)
{
    char *direct;
    char filepath[250];

    ...

    direct = malloc(strlen(dir) + strlen(name->d_name) + 2);
    strcpy(direct, dir);
    strcat(direct, "/");
    strcat(direct, name->d_name);

    getdir(direct);
    free(direct);
}
else
{
    // Concatenate file name
    strcpy(filepath, dir);
    strcat(filepath, "/");
    strcat(filepath, name->d_name);

    if(filepath[strlen(filepath) - 1] != '~')
        readFile(filepath);
}

这似乎很有效。如果有任何我不应该做的事情,请告诉我。感谢大家的帮助!

0 个答案:

没有答案