|
第3日の最後に言っていたファイルの検索ルーチンを作ってみようと思う。 ここで問題なのはそのアルゴリズムである。C言語を始めてまだ1年ちょっとの筆者には皆目検討がつかない・・・(オイオイ)。ディレクトリ階層は最大何階層あるか分からないし、ディレクトリ名も最大何文字までつけられるか分からない。 それをすべてリストアップしていたらメモリがいくつあっても足らないし、IF&SWITCH 文の嵐になってしまう。そんな恐ろしい事ができるわけがない。 |
|
|
そこで、「 再起呼び出し 」を利用する事によって単純に検索できるように作ってみようと思う。再起呼び出しとは関数の中から自分自身を呼び出す事である。簡単に書くと、以下のような形になる。
void Saiki( int num )
{
if( num == 0 ){
exit( -1 );
}
else{
num--;
Saiki( num );
}
}
Saiki 関数中から自分自身を呼び出している。再起呼び出しはどのアルゴリズム辞典にも載っているので分からない方は呼んでみるといいだろう。 さて、ここで本題に戻ろう。今作りたいのはファイル検索ルーチンなので関数名を「 SearchDir 」とし、findfirst とfindnext を使ってファイルとディレクトリを検索し、ディレクトリが発見されたら自分自身を再起呼び出しをして、全ファイルの検索を行おうと思う。作ったルーチンを以下に示す。
void CFileEaterDlg::SearchDir(char* path)
{
_finddata_t ffblk;
long handle;
_chdir(path);
if( (handle = _findfirst("*", &ffblk)) != -1){
do{
if( (strcmp(ffblk.name, ".") != 0 &
& strcmp(ffblk.name, "..") != 0 ) ){
if( ffblk.attrib == _A_SUBDIR ){
strcat(path, ffblk.name);
strcat(path, "\\");
SearchDir(path);
}
else{
m_LstFileName.AddString(ffblk.name);
}
}while( _findnext(handle, &ffblk) != -1 );
}
path[strlen(path) - 1] = '\0';
char* p = strrchr(path, '\\');
if(p == NULL)
return;
*(p + 1) = '\0';
}
|
|
|
|
以上の関数でファイルの全検索が可能になった。 このサンプルアプリケーションのソースコードはここからダウンロードできる。 |