아래 코드를 사용하면 폴더 경로를 입력으로 사용할 때 문제가 있습니다 (" pack ") 경로를 폴더 또는 하위 폴더에서 문자열 배열로 찾을 수있는 각 .wav 파일에 배치합니다.C - 폴더 및 하위 폴더의 모든 wav 파일 경로를 재귀 함수를 사용하여 문자열 배열로 변환
아래에서 볼 수있는 코드가 다운됩니다.
너희들을 요청하기 전에 나 자신으로 검색을했습니다와 내가 함께 테스트하고있어 해당 폴더
폴더 구조의 첫 번째 파일에 대한 realloc 함수하려고 할 때 충돌이 두 번째 하위 폴더에있는 동안을 추가 할 것으로 보인다 도움 이렇게되면 :
이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;
}
편집 : 내가는 MinGW (GCC)와 codelite를 사용, 창문에있어, 어떤 오류 메시지가없는, 창문 그냥 제공 나 옛날 "작동을 멈췄다"오류.
또한 버전 및 플랫폼에 대한 오류 메시지와 몇 가지 세부 사항을 제공하십시오! – jkalden
로컬 변수의 주소를 저장하고 있습니다. 그러면 정의되지 않은 동작이 발생합니다. 경로에 대한 포인터가 아니라 경로 자체에 대한 공간을 동적으로 할당해야합니다. 'strdup()'를 사용한다면, 그것을 다시 구현해야한다. – unwind
BTW, 숙제가 아니라면 "파일 트리 워크"(https://linux.die.net/man/3/ftw)를 선택하거나 고급 언어/라이브러리를 사용할 수도 있습니다 – Igor