2011-10-23 13 views
1

私がしなければならないことは、事前に指定された特定のディレクトリとそのサブディレクトリから ".mp3"アーカイブを再帰的に取得することです。 mp3を入手してコンソールに印刷するのに問題はありませんでした。私はhttp://www.gnu.org/software/libc/manual/html_node/Working-with-Directory-Trees.html#Working-with-Directory-Treesに指定されたFTW機能を使用しています、そのコールバック関数は次のようになります。私は本当に何をしたいのか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

ありがとうございました...私はscandirを使用していましたが、プロトタイプ以来同じ問題があります。int scandir(const char * dir、struct dirent *** namelist、int(* selector)(const – PALEN

+0

これは顧客の議論もありません...単にグローバル変数を使用するか、または一時ファイルを作成することをお勧めしますか? (二重の投稿のために申し訳ありませんが、誤って押されたEnterキー) – PALEN

+0

私はちょうどopendirし、あなたの関数を再帰的に呼び出すreaddirです。次に、見つかったファイルのリストを渡して独自の拡張マッチングを行い、一致するファイル名をそのリストに入れます。 –

関連する問題