2011-10-23 2 views
1

Что мне нужно сделать, это рекурсивно получить архивы «.mp3» из определенного заранее заданного каталога и его подкаталогов. У меня не было проблем с получением mp3 и их печать на консоли. Я использую функцию FTW, указанную в http://www.gnu.org/software/libc/manual/html_node/Working-with-Directory-Trees.html#Working-with-Directory-Trees, его функция обратного вызова будет выглядеть следующим образом:Сохранение результатов поиска в каталоге функции ftw

/* Call-back of ftw function*/ 

int filter_mp3s(const char *dir_name, const struct stat *status, int typeflag){ 

    if (typeflag == FTW_D){ 

     struct dirent **mp3list; 
     int num_archives; 
     int counter; 

     num_archives = scandir (dir_name, &mp3list, select_mp3_ext, alphasort); 

     /* print mp3 names */ 
     if (num_archives > 0) for (counter = 0; counter <= num_archives - 1; counter++) printf("%s\n", mp3list[counter]->d_name); 

    } 

    return 0; 
} 

То, что я действительно хочу сделать, это поместить имена файлов в комбо-боксе виджет GTK. Проблема в том, что функция возвращает тип int, и функция не является гибкой с ее параметрами, поэтому я могу «сохранить» что-то в записи. Другими словами, найдены mp3, но я не знаю, как сохранить результаты, чтобы загрузить их в поле со списком в другой функции. Я не хочу использовать глобальные переменные ... Я новичок в этом, заранее за вашу помощь.

ответ

0

Если обратный вызов не имеет аргумента клиента (обычно это void *), который, по-видимому, имеет место, вам придется помещать найденные данные в глобальную переменную, что является неудачным. Если это проблема (т. Е. Вы находитесь в многопоточной среде), вам придется реализовать собственную версию рекурсивного обхода каталога с помощью интерфейса opendir. Это не сложно.

+0

Большое спасибо ... Ну, я сделал это с помощью скандинава, но все еще имею ту же проблему, что и его прототип: int scandir (const char * dir, struct dirent *** namelist, int (* selector) (const struct dirent *), int (* cmp) (const void *, const void *)) – PALEN

+0

У него нет аргумента клиента ... Не могли бы вы рекомендовать мне просто использовать глобальную переменную или, возможно, создать временный файл? (извините за двойной пост, случайно нажал клавишу ввода) – PALEN

+0

Я бы просто открыл, а затем readdir, вызвав вашу функцию рекурсивно. Затем вы передаете список найденных файлов и выполняете собственное сопоставление с расширением, затем помещаете соответствующие имена файлов в этот список. –