1. 程式人生 > >C++Windows下遞迴遍歷多級目錄

C++Windows下遞迴遍歷多級目錄

#include <tchar.h>
#include <Windows.h>
#include <Shlwapi.h>
#pragma comment( lib, "Shlwapi.lib" )
#include <strsafe.h>

bool ForeachFileByDirectory( LPCTSTR pDirectory )
{
    if( NULL == pDirectory )
    {
        return false;
    }
    
    //不存在的路徑
    if( FALSE == PathFileExists( pDirectory ) )
    {
        return false;
    }

    //遍歷所有型別檔案
    WIN32_FIND_DATA FindData;
    TCHAR Directory[ MAX_PATH ];
    StringCbPrintf( Directory, sizeof( Directory ), TEXT( "%s\\*.*" ), pDirectory );

    //找到當前目錄第一個控制代碼
    HANDLE hFile = FindFirstFile( Directory, &FindData );
    if( INVALID_HANDLE_VALUE == hFile )
    {
        return false;
    }

    TCHAR FullDirectory[ MAX_PATH ];
    do
    {
        //過濾開啟資料夾符號
        if( TEXT( '.' ) == FindData.cFileName[ 0 ] )
        {
            continue;
        }

        //得到當前遍歷的完整路徑
        StringCbPrintf( FullDirectory, sizeof( FullDirectory ), TEXT( "%s\\%s" ), pDirectory, FindData.cFileName );

        //找到一個檔案
        if( 0 == ( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
        {
            _tprintf( TEXT( "find file: %s size:%d bytes.\n" ), FullDirectory, FindData.nFileSizeLow );
        }
        //否則找到一個資料夾
        else
        {
            _tprintf( TEXT( "find directory: %s.\n" ), FullDirectory );
            //繼續遞迴這個資料夾
            if( false == ForeachFileByDirectory( FullDirectory ) )
            {
                return false;
            }
        }
    }
    while( FALSE != FindNextFile( hFile, &FindData ) );
    //檢查退出迴圈條件是否是沒有檔案了否則出錯
    if( ERROR_NO_MORE_FILES != GetLastError() )
    {
        return false;
    }
    FindClose( hFile );
    hFile = NULL;
    return true;
}
int main()
{
    //遍歷當前工作路徑下ok目錄下所有檔案和資料夾
    bool b = ForeachFileByDirectory( TEXT( ".\\ok" ) );
    return 0;
}

ok目錄:

輸出結果: