C - 将文件夹和子文件夹中的所有wav文件路径放入带有递归函数的字符串数组中

时间:2017-01-31 10:46:16

标签: c file recursion directory subdirectory

我在使用下面的代码时遇到了一些麻烦,它可以将文件夹的路径作为输入(在我的情况下为“pack”)并将路径放到它可以在文件夹或子文件夹中找到的每个.wav文件中一个字符串数组。

您可以在下面看到的代码崩溃。

在向你们提供一些帮助之前我自己搜索并且在第二个子文件夹中尝试重新分配该文件夹的第一个文件时崩溃似乎会附加

我正在测试的文件夹结构如下:

pack
├── _subfolder1
|   ├── wavefile1.wav
|   ├── wavefile2.wav
|   └── wavefile3.wav
├── _subfolder2
|   └── wavefile4.wav
├── _subfolder3
|   ├── wavefile5.wav
|   └── wavefile6.wav

代码:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

void find_dir_content(char* path, char** filepathlist, int* size)
{

    DIR* d = opendir(path);
    if(d == NULL)
        return;
    struct dirent* dir;

    while((dir = readdir(d)) != NULL) 
    {
        int isdir = 0;
        DIR* tmp;
        char f_path[255]; 
        sprintf(f_path, "%s/%s", path, dir->d_name);
        if((tmp = opendir(f_path))) { 
            closedir(tmp);
            isdir = 1;
        }

        if(!isdir) {

            char *dot = strrchr(dir->d_name, '.');
            if (dot && !strcmp(dot, ".wav")){
                char** tmp = realloc(filepathlist, sizeof(char*) * ((*size)  + 1));
                if (tmp == NULL)
                {
                    return;
                }
                else
                {
                    filepathlist = tmp;
                }
                char d_path[256];
                sprintf(d_path, "%s/%s", path, dir->d_name);
                filepathlist[*size] = d_path;
                //printf("%d : %s\n", *size, filepathlist[*size]);
                (*size)++;

            }
        }
        else if(isdir && strcmp(dir->d_name, ".") != 0 &&
            strcmp(dir->d_name, "..") != 0)
        {
            char d_path[256];
            sprintf(d_path, "%s/%s", path, dir->d_name);
            //printf("%s\n", d_path);
            find_dir_content(d_path, filepathlist, size);


        }
    }
    closedir(d);

}

int main(int argc, char** argv)
{
    int sizefilepathlist = 0;
    char** filepathlist = (char**) malloc(0*sizeof(char*));
    find_dir_content("pack", filepathlist, &sizefilepathlist);
    for(int i = 0; i< sizefilepathlist; i++){
        printf("%s", filepathlist[i]);
    }

    return 0;
}

编辑:我在Windows上,我使用minGW(gcc)的codelite,并且没有错误消息,Windows只是给了我旧的“已经停止工作”错误。

1 个答案:

答案 0 :(得分:0)

正如@unwind在评论中指出的那样:

  

您正在存储本地变量的地址。那会让你得到不确定的行为。您必须为路径本身动态分配空间,而不仅仅是指向它的指针。

最小的变化是改变线:

            filepathlist[*size] = strdup(d_path); // d_path will go out of scope - copy the string to dynamically allocated memory.

#include <string.h>

确保strdup获取realloc(filepathlist)的原型。

修改

另一个问题是,mainfind_dir_content中的变量仍指向旧位置。这可以通过让filepathlist返回char **filepathlist(...) { ... return filepathlist; }

的当前位置来解决
filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);

并在主要:

$post = factory(Post::class)->create();

$first_tag = factory(Tag::class)->create();
$second_tag = factory(Tag::class)->create();


$post->tags()->attach($first_tag);
$post->tags()->attach($second_tag);

$this->assertEquals(2, $post->tags->count());