FindFirstFile()関数、FindNextFile()関数を利用して、指定したフォルダ内の ファイルをサブフォルダを含めて全て巡回します。サブフォルダの巡回は再起処理で行っています。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <windows.h> /* 指定したフォルダ内のファイルをサブフォルダを含めて巡回する */ void FindDirectory ( std::wstring oFolderPath // フォルダパス ) { WIN32_FIND_DATA tFindFileData; // 全てのファイル oFolderPath += L"¥¥*.*"; // 最初に一致するファイルを取得 HANDLE hFile = ::FindFirstFile( oFolderPath.c_str(), &tFindFileData ); if ( INVALID_HANDLE_VALUE == hFile ) { return; } // L"¥¥*.*"を削除 oFolderPath = oFolderPath.substr( 0, oFolderPath.size() - 4 ); do { TCHAR* wpFileName = tFindFileData.cFileName; // フォルダかどうかを判定 if ( tFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { /* L"."とL".."はスキップ */ if ( L'.' == wpFileName[ 0 ] ) { if ( ( L'¥0' == wpFileName[ 1 ] ) || ( L'.' == wpFileName[ 1 ] && L'¥0' == wpFileName[ 2 ] ) ) { continue; } } // フルパスの生成 std::wstring oFullPath = oFolderPath+ L"¥¥" + wpFileName; std::wcout << L"(dir )" << oFullPath << std::endl; // 再起してサブフォルダを巡回する FindDirectory( oFullPath ); } else { // フルパスの生成 std::wstring oFullPath = oFolderPath + L"¥¥"+ wpFileName; std::wcout << L"(file)" << oFullPath << std::endl; } // 次に一致するファイルの検索 } while( ::FindNextFile( hFile, &tFindFileData ) ); // 検索ハンドルを閉じる ::FindClose( hFile ); } int _tmain ( int argc , _TCHAR* argv[] ) { // 標準出力にユニコード出力する setlocale( LC_ALL, "Japanese" ); // 指定したフォルダ内のファイルをサブフォルダを含めて巡回する FindDirectory( L"C:¥¥TestFolder" ); // 正常終了 return( 0 ); }
(dir )C:\TestFolder\FolderA
(file)C:\TestFolder\FolderA\FolderA-01.txt
(file)C:\TestFolder\FolderA\FolderA-02.txt
(dir )C:\TestFolder\FolderA\FolderB
(file)C:\TestFolder\FolderA\FolderB\FolderB-01.txt
(file)C:\TestFolder\FolderA\FolderB\FolderB-02.txt
(file)C:\TestFolder\TestFolder-01.txt
(file)C:\TestFolder\TestFolder-02.txt