2016-04-08 46 views
-2

C言語を使用してディレクトリ内の同じ拡張子を持つすべてのファイルを見つける方法はありますか? 私は唯一の引数として拡張子を入力したいわけその後、私は、私はあなたがscandirを使用したいC言語を使用してディレクトリ内の同じ拡張子を持つすべてのファイルを見つける方法はありますか?

int main (int argc,char *argv[]) 
{ 
    DIR *dir; 
    struct dirent *dent; 

    if (argc != 3) { 
     printf("usage: ./Exe_Name dir_name file_name");  
    } 
    dir = opendir(argv[1]); 
    //this part 
    if(dir!=NULL) { 
     while((dent=readdir(dir))!=NULL) 
      if(strcmp(dent->d_name,argv[2])==0) 
       printf("%s\n",dent->d_name); 

    } else 
     printf ("Cannot open directory '%s'\n", argv[1]); 
    closedir(dir); 
    return 0; 
} 
+0

おそらくできるだけ多くの貢献者の時間を無駄にしてcopypastaの最良の広がりを得るために、askubuntuとmoftalkにクロスポストのように、globを使用することです宿題の答え。 –

+1

実際の問題は2つの文字列 '' filename.xyz ''(' argv')と '' otherfilename.xyz' '(' readdir() 'や' 'scandir()')を比較し、一致?あなたのコードには何の努力もありません。 – dhke

+0

私は、虐待的で利己的なクロスポストのために、この質問をトピックとして閉じようとしています。 –

答えて

5

を入力された拡張子を持つすべてのファイルを一覧表示します。 man pageから:

int scandir(const char *dir, struct dirent ***namelist, 
      int(*filter)(const struct dirent *), 
      int(*compar)(const struct dirent **, const struct dirent **)); 

    int alphasort(const void *a, const void *b); 
    int versionsort(const void *a, const void *b); 

SCANDIR()関数は、各ディレクトリエントリにフィルタ() を呼び出し、ディレクトリdirを走査します。 filter()が 以外の値を返すエントリは、比較関数compar()で qsort()を使用してソートされ、malloc()によって割り当てられた の配列名リストに収集されたmalloc()によって割り当てられた文字列に格納されます。 filterがNULLの場合、 すべてのエントリが選択されます。

比較関数compar()の としてalphasort()関数とversionsort()関数を使用できます。前者は、 のstrcoll(3)を使用してディレクトリエントリを並べ替えます。

+0

'scandir'のPOSIX-2008は私が知っていたより新しいものです。これは、私が提案しようとしていた順番に 'readdir'(POSIX.1-2001)の結果を手動で解析するのに、膨大な時間を節約します。あなたにポイント! – Tommy

+0

ニース。 'versionsort()'はGNU拡張であることを覚えておいてください。 –

1

古い学校の方法はman -S 3 glob

#include <glob.h> 

    int glob(const char *pattern, int flags, 
      int (*errfunc) (const char *epath, int eerrno), 
      glob_t *pglob); 
    void globfree(glob_t *pglob); 
関連する問題