指定したディレクトリ以下のファイルを列挙

ここでは、FindFirstFileとFindNextFileの二つを使って機能を実現させます。

順を追って説明しますと

1 FindFirstFileで指定した条件に該当するファイル郡の情報とその最初のファイル情報を取得する。

2 FindNextFileでFindFirstFileで取得したハンドルから次のファイル情報を取得する。

3 FindNextFileで取得したファイルがディレクトリだったら、それを引数にして再帰的に FindFirstFileを呼び出す。

分かりにくいと思いますので図で説明します。

1 FindFirstFileでa.txtの情報を取得する。
2 次にFindNextFileでb.txtの情報を取得する。
3 引き続きFindNextFileを実行するとDirというディレクトリの情報を取得できる。
4 ディレクトリだったので、これを引数にしてFindFirstFileを実行。すると d.txtの情報を取得できる。
5 e.txt以後はファイルが無いので、リターンする
6 最後にc.txtを読み込んで処理は終了。

簡単に言うと、こんな感じになります。
細かいところは、リストを見ながら説明しましょう。

関数
void Directory(char path[])
{
    char subpath[_MAX_PATH];
    char temp[_MAX_PATH];
    WIN32_FIND_DATA lp;

    strcpy(temp,path);
    HANDLE h=FindFirstFile(temp,&lp);

    temp[strlen(temp)-1]='\0';//*を消している
    do
    {      
        if((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            && strcmp(lp.cFileName,"..")!=0 && strcmp(lp.cFileName,".")!=0)
        {            
           //subpathでディレクトリのフルパスが分かる
            wsprintf(subpath,"%s%s\\*",temp,lp.cFileName);
            Directory(subpath);
        }
        if((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=FILE_ATTRIBUTE_DIRECTORY)
        {
           // lp.cFilenameでファイル名が分かる
           // wsprintf(出力文字列,"%s%s",temp,lp.cFileName);とすれば
           // ファイルのフルパスが分かる

           //こちらはファイルサイズ
           //size+=lp.nFileSizeHigh*MAXDWORD+lp.nFileSizeLow ;
           
        }        
    } while(FindNextFile(h,&lp));
 
        FindClose(h);
}

どこかで Directory("D:\\*"); とすればDドライブのファイル名やディレクトリ名が分かる とまぁ、こんな感じになります。

リスト中において
Directory("D:\\*");の様に指定すると、「D:\」以下の任意のファイル又はディレクトリを 指定することになります。 ディレクトリ名が「..」 又は「 .」の場合は再帰的にFindFirstFileを呼び出していないのは これらのディレクトリは現在よりも深い階層のディレクトリではないからです。
関数の中身を工夫すれば、指定したディレクトリ以下のファイルサイズの合計を算出する プログラムなどができます。
もっと簡単な方法がありそうな気がしますがまぁいいでしょう。

(7/20)追記
指定したディレクトリ以下のファイルサイズの合計を取得したいという質問が来てたのですが(最近全然チェックしていなかったので気がつきませんでした。ごめんなさい) lp.nFileSizeHigh*MAXDWORD+lp.nFileSizeLow;でファイルサイズを取得できますのでこれを適切な場所へいれてもらえればファイルサイズの合計が取得できます。


戻る