C-使用递归函数将文件夹和子文件夹中的所有wav文件路径放入字符串数组中
我在下面的代码中遇到了一些问题,它应该将文件夹的路径作为输入(在我的例子中是“pack”),并将文件夹或子文件夹中每个.wav文件的路径放入字符串数组中 您可以在下面看到的代码崩溃了 在向你们寻求帮助之前,我已经自己搜索过了,当试图重新定位该文件夹的第一个文件时,崩溃似乎在第二个子文件夹中追加 我正在测试的文件夹结构如下所示:C-使用递归函数将文件夹和子文件夹中的所有wav文件路径放入字符串数组中,c,file,recursion,directory,subdirectory,C,File,Recursion,Directory,Subdirectory,我在下面的代码中遇到了一些问题,它应该将文件夹的路径作为输入(在我的例子中是“pack”),并将文件夹或子文件夹中每个.wav文件的路径放入字符串数组中 您可以在下面看到的代码崩溃了 在向你们寻求帮助之前,我已经自己搜索过了,当试图重新定位该文件夹的第一个文件时,崩溃似乎在第二个子文件夹中追加 我正在测试的文件夹结构如下所示: pack ├── _subfolder1 | ├── wavefile1.wav | ├── wavefile2.wav | └── wavefile3.wa
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;
}
#包括
#包括
#包括
无效查找目录内容(字符*路径,字符**文件路径列表,整数*大小)
{
DIR*d=opendir(路径);
如果(d==NULL)
返回;
结构方向*dir;
而((dir=readdir(d))!=NULL)
{
int-isdir=0;
DIR*tmp;
字符f_路径[255];
sprintf(f_路径,“%s/%s”,路径,目录->d_名称);
如果((tmp=opendir(f_路径)){
closedir(tmp);
isdir=1;
}
if(!isdir){
char*dot=strrchr(dir->d_name,”);
如果(点&!strcmp(点,.wav))){
char**tmp=realloc(filepathlist,sizeof(char*)*((*size)+1));
if(tmp==NULL)
{
返回;
}
其他的
{
filepathlist=tmp;
}
字符d_路径[256];
sprintf(d_路径,“%s/%s”,路径,目录->d_名称);
filepathlist[*size]=d_路径;
//printf(“%d:%s\n”,*大小,文件路径列表[*大小];
(*大小)+;
}
}
如果(isdir&&strcmp(dir->d_name,”)=0&&
strcmp(dir->d_name,“..”!=0)
{
字符d_路径[256];
sprintf(d_路径,“%s/%s”,路径,目录->d_名称);
//printf(“%s\n”,d\u路径);
查找目录内容(d路径、文件路径列表、大小);
}
}
closedir(d);
}
int main(int argc,字符**argv)
{
int-sizefilepathlist=0;
char**filepathlist=(char**)malloc(0*sizeof(char*);
查找目录内容(“pack”、filepathlist和sizefilepathlist);
对于(int i=0;i
编辑:我在windows上,我使用带有minGW(gcc)的codelite,没有错误消息,windows只给我旧的“已停止工作”错误。正如@unwind在评论中指出的:
您正在存储一个局部变量的地址。这将使您的行为不明确。您必须动态地为路径本身分配空间,而不仅仅是指向它的指针 最小的改变是改变线路:
filepathlist[*size] = d_path;
到
确保您#包括
,以获取strdup
的原型
编辑:
另一个问题是,当realloc(filepathlist)
时,main
中的变量仍然指向旧位置。这可以通过让find_dir_content
返回filepathlist
的当前位置来解决:
char **filepathlist(...) {
...
return filepathlist;
}
总的来说:
filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);
还请提供错误消息以及有关版本和平台的一些详细信息!您正在存储一个局部变量的地址。这将使您的行为不明确。您必须动态地为路径本身分配空间,而不仅仅是指向它的指针。如果你有
strdup()
使用它,否则重新实现它。顺便说一句,除非这是你的家庭作业,否则你可以选择“文件树漫游”,甚至使用高级语言/库sprintf
是危险的,至少使用snprintf
。谢谢你和@unwind为你的答案,我确信他们已经解决了部分问题,但错误仍然存在here@halcaponey我添加了另一个错误修复
filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);