フォルダ内のファイルを列挙する

twst86.gif
フォルダの中に含まれるファイルはFindFirstFile、FindNextFile、FindCloseで検索できる。ここでは指定したフォルダに含まれるファイルをCAtlArrayに格納して返す。CAtlArrayはCStringArrayと同じでCStringの配列になる。

依存環境:ATL
#include "atlstr.h"
#include "atlcoll.h"

//
//	フォルダ内のファイル検索
//
//見つかったファイルをpastrFilesに追加する
//nRecursiveは子フォルダの探索数(デフォルトは探索しない)
//
bool	GetFilesInFolder(LPCTSTR pszFolder,CAtlArray<CAtlString>* pastrFiles,int nRecursive=0)
{
	BOOL			bFind;
	HANDLE			hFind;
	WIN32_FIND_DATA	FindFileData;
	CAtlString		strFolder;

	if(pszFolder == NULL || _tcslen(pszFolder) == 0 || pastrFiles == NULL)
		return	false;

	//astrFiles.RemoveAll();

	strFolder = pszFolder;
	if(strFolder.Right(1) != _T('\\') && strFolder.Right(1) != _T('/'))
		strFolder += _T("\\");

	hFind = ::FindFirstFile(strFolder + _T("*.*"),&FindFileData);
	if(hFind == INVALID_HANDLE_VALUE)
		return	false;

	bFind = TRUE;
	while(bFind)
	{
		if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			//フォルダなら...
			if(nRecursive > 0 && _tcsncmp(FindFileData.cFileName,_T("."),1) != 0 && _tcsncmp(FindFileData.cFileName,_T(".."),2) != 0 )
			{
				//再起で子フォルダ内を調べる
				GetFilesInFolder(strFolder + FindFileData.cFileName,pastrFiles,nRecursive - 1);
			}
		}
		else
		{
			//ファイルなら...
			pastrFiles->Add(strFolder + FindFileData.cFileName);
		}

		bFind = ::FindNextFile(hFind,&FindFileData);
	}
	::FindClose(hFind);

	return	true;
}




void	Test(void)
{
	CAtlArray<CAtlString>	astrFiles;

	GetFilesInFolder(_T("c:\\"),&astrFiles);

	size_t		i;
	size_t		nSize;
	CAtlString	strMessage;

	nSize = astrFiles.GetCount();
	for(i = 0; i < nSize; i++)
	{
		strMessage += astrFiles[i];
		strMessage += _T("\n");
	}

	::MessageBox(NULL,strMessage,_T(""),MB_OK);
}


プロジェクトファイルをダウンロード


カテゴリー「ファイル・フォルダ」 のエントリー