ディレクトリトラバーサル、ディレクトリパス内のすべてのファイルの配列へのアクセス
1つの#include <iostreamの> 2の#include <dirent.h> 3。の#include <ベクトル> 4。 5。 ボイド LISTDIR(CHAR *パス、STD ::ベクトル<STD :: 文字列 > * ファイル) 6。 { 7。 DIR * directory_pointer; 8 構造体はdirent * エントリ; 9 チャー子のパス[ 512 ]; // 読み出しパス格納するために使用される文字の配列、定義する 10 文字のファイルパス[ 512 ]; //は読み出しパスを格納するために使用される文字の配列を定義する 。11 directory_pointer = opendir(パス)。 12である のmemset(子のパス、0、はsizeof(子のパス)); // 文字の配列の配列要素のすべてゼロ子のパス 13は 、一方(!(エントリ= READDIR(directory_pointer))= NULL) // PDIRオープンディレクトリを読み取り、そしてディレクトリが空であるか否かを判定しながら、ループが実行される空でない、ENTに割り当てられた 14 { 15 IF(エントリー・> d_type&DT_DIR) // 場合は、ディレクトリ・ファイルと、すなわち演算とDT_DIR有するビットのタイプをオープン読み取りますd_type型リードDT_DIR(= 4、読み出しディレクトリテーブル)で 16 { 17 IF(のstrcmp(エントリー・> d_name、" ")== 0 ||のstrcmp(エントリー・> d_name、" .. ") == 0 ) 18 { 19 // もしd_name ..又は読み出しがcontiueをスキップして、次の出力が行われていない、シンボルとディレクトリシンボルに読み込まれ、現在のディレクトリに示されている。 20が 続け、 21である } 22が 23である のsprintfは、(子のパス" S%/ S%"パス、エントリー・> d_name); // 非もし...パスとファイル名がd_nameの子のパスを支払って、次の行のprintfが出力されます。 24 // のprintf("パス:%S \ N- 」子のパス); 25 LISTDIR(子のパス、ファイル); // これは、再帰的であるため、再帰ディレクトリは、下位ワードの内容を読み取るように外側内側ディレクトリ(ディレクトリ名+パス)から順に全出力 26 // 前他のアウト順次すべてのファイル名から出力された 27 } 28 他に //型はd_type DT_DIRを読み取るされていない場合、すなわち、読み出しがディレクトリではなく、直接ファイル、d_name出力、すなわち、出力ファイル名 29 { 30 のsprintf(ファイルパス、「%S /%S 」、パス、エントリー・> d_name ); 31である (printfの" ファイルパス:%S \ N- "、ファイルパス); // 出力ファイル名ディレクトリベルト 32 ファイル- > 一back(ファイルパス); 33れる } 34れる } 35 } 36 37 [ int型のmain(int型 ARGC、const のchar * ARGV []){ 38です // INSERTコードはこちら壁紙... 39 のstd :: coutの<< " LISTFILEスタート\ N!" ; 40の 41 のstd :: 文字列 RES = " RES " 。 42 のchar *パス=はconst_cast < CHAR *> (res.c_str())。 43 のstd ::ベクトル<はstd :: 文字列 > ファイル; 44 LISTDIR(パス、およびファイル)。 45 リターン 0 ; 46 }
結果: