概要

FindFirstFile APIとFindNextFile APIを用いてフォルダー内のファイル名を検索するプログラムである。
E:¥testフォルダーについてエクスプローラによる表示結果と本プログラムの表示結果を以下に示す。

エクスプローラでE:¥testを表示本プログラムの実行結果
.
..
Debug
findfile1
findfile1.sdf
findfile1.sln
Release
x64

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

プロジェクトの作成

Win32コンソールアプリケーション

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

_tmain関数

_tsetlocale関数によりUNICODE文字を標準出力に正しく表示させるためにロケールを設定します。
FindFirstFile APIで検索条件を指定し最初の1個目のファイルの情報を取得します。
1個目の引数が検索条件です。E:¥testフォルダーのすべてのフォルダー名・ファイル名を検索するには、E:¥¥test¥¥*.*と記述します。
戻り値は検索ハンドルです。
戻り値がINVALID_HANDLE_VALUEの場合は、ファイルが見つからないことを示しています。
検索されたファイル名に関する情報はFindFileData構造体に格納されます。
FindFileData構造体メンバは以下の通りです。
DWORD  dwFileAttributes;       // 属性
FILETIME  ftCreateTime;        // 作成日時
FILETIME  ftLastAccessTime;    // 最終アクセス日時
FILETIME  ftLastWriteTime;     // 最終更新日時
DWORD  nFileSizeHigh;          // ファイルサイズ(上位32ビット)
DWORD  nFileSizeLow;           // ファイルサイズ(下位32ビット)
TCHAR  cFileName[MAX_PATH];    // ファイル名
TCHAR  cAlternateFileName[14]; // 8.3形式のファイル
FindFileData構造体のメンバであるcFileNameを_putts関数により標準出力へ表示します。
次のファイルを検索するためには、FindNextFile APIを用います。戻り値が0の場合は、ファイルが見つからないことを示しているのでファイルの検索を終了させます。
検索が終了したらFindCloseにより検索ハンドルを解放します。

プログラムソース

// フォルダー内のファイル名を検索する
// Visual C++ 2013 32/64bit

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>

void _tmain(void){
	//	UNICODE文字を標準出力に正しく表示させるためにロケールを設定
	_tsetlocale(LC_ALL, _TEXT(""));

	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;

	hFind = FindFirstFile(_TEXT("E:¥¥test¥¥*.*"), &FindFileData);
	if (hFind != INVALID_HANDLE_VALUE){
		do{
			_putts(FindFileData.cFileName);
		} while (FindNextFile(hFind, &FindFileData));
		FindClose(hFind);
	}
}

ソースファイルのダウンロード

ダウンロード findfile1.zip(520Byte)
ZIPファイルに含まれるファイル
findfile.cpp