FindFirstFile을 이용해 파일 리스트 구하기

비FindFirstFile 윈도우 API를 이용해 파일 리스트를  std::vector에 저장한다.

pszFilter의 옵션과 iLevel의 옵션은 아래 소스의 주석에서 참고 한다.

#include <stdio.h>

#include <windows.h>

#include <vector>

#include <string>

#include <iostream>

 

/*

pszDirectory : 찾고자 하는 폴더의 위치

 

pszFilter : 검색할 필터

    *.dds  dds 파일만 검색하는 경우

    *      모든 파일및 폴더를 찾는다.

    \\    폴더만 찾는다

 

iLevel    : 검색 할 하위 폴더의 깊이

    1      바로 하위 폴더만 검색

    -1    모든 폴더 검색

    2      바로 하위 폴더, 그 다음 하위 폴더 검색

*/

void GetFindFileList( char* pszDirectory, char* pszFilter, std::vector <std::string> *vtList, int iLevel = -1 )

{

    if( iLevel == 0 )

        return;

 

    char buf[MAX_PATH];

    WIN32_FIND_DATA FindFileData;

 

    bool bAddFile = true;

    bool bAddFolder = false;

    if( pszFilter[1] == 0 )

    {

        if( pszFilter[0] == '\\' )

        {

            bAddFile = false;

            bAddFolder = true;

        }

        else if( pszFilter[0] == '*' )

        {

            bAddFolder = true;

        }

    }

 

    strcpy_s( buf, MAX_PATH, pszDirectory);

    strcat_s( buf, MAX_PATH, "\\");

    if( bAddFolder == true )

        strcat_s( buf, MAX_PATH, "*.*" );

    else

        strcat_s( buf, MAX_PATH, pszFilter);

 

    HANDLE hHandle = FindFirstFile( buf, &FindFileData );

 

    for( ; hHandle != INVALID_HANDLE_VALUE; )

    {       

        if( ( FindFileData.cFileName[0] != '.' || strlen( FindFileData.cFileName) > 2 ) &&

            ( 0 != _stricmp( FindFileData.cFileName, "Replay"))) //  Replay 폴더는 지우지 않는다

        {

            strcpy_s( buf, MAX_PATH, pszDirectory );

            strcat_s( buf, MAX_PATH, "\\" );

            strcat_s( buf, MAX_PATH, FindFileData.cFileName );

 

            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

            {

                if( bAddFolder )

                    vtList->push_back(buf);

                GetFindFileList(buf, pszFilter, vtList, iLevel - 1 );

            }

            else

            {

                if( bAddFile )

                    vtList->push_back(buf);

            }

 

        }

 

        if( !FindNextFile(hHandle,&FindFileData) )

            break;

    }

    FindClose(hHandle);

}

 

 

void main()

{

    std::vector <std::string> vtFileList;

    std::vector <std::string>::iterator iter;

 

    GetFindFileList("d:\\work", "*.*", &vtFileList, 1 );

    int FileCount = (int)vtFileList.size();

 

    for ( iter = vtFileList.begin(); iter != vtFileList.end() ; ++iter )

    {

        const char *fileName = iter->c_str();

        std::cout << fileName << std::endl;

    }

}

소스 :  FindFirstFile.cpp

[펌]
http://www.codesarang.com/code/content_38.html