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