获取当前目录下的文件,目录 (封装)


本人正在开发一个简单的游戏服务器引擎,期间遇到载入文件夹下的所有lua文件,需要遍历目录和子目录获取所有的lua文件,运用到的是windows函数获取目录下的文件和目录,由于windows提供的函数为获取目录下的制定类型的文件,但不能获取子目录中的文件。本人进行一次函数封装,共提供3个基本函数:

// 查找当前目录下的所有目录(不包括当前目录)
void FindAllDir(const char* pCurDir, vector& vtDirs);
// 查找当前目录下的所有文件(不包括子目录),制定查找文件类型,如:*.txt,*.lua,*.*
void FindAllFile(const char* pCurDir, const char* pFileType, vector& vtFiles);
// 查找当前目录下的所有文件(包括子目录),制定查找文件类型,如:*.txt,*.lua,*.*
void FindAllFileE(const char* pCurDir, const char* pFileType, vector& vtFiles);


通过FindAllFileE这个函数可以获取当前目录下和子目录下的所有lua文件,函数调用方法为:


// lua目录
	char szLuaPath[MAX_PATH] = {0};
	_snprintf(szLuaPath, MAX_PATH, "%s\\lua\\", GetRootPath());

	vector luaFiles;
	CFileAndDirFinder cFileAndDirFinder;
	cFileAndDirFinder.FindAllFileE(szLuaPath, "*.lua", luaFiles);

	// 遍历所有lua文件并通过lua_tinker进行加载。
	vector::iterator itLuaFile = luaFiles.begin();
	for (; itLuaFile!=luaFiles.end(); ++itLuaFile)
	{
		lua_tinker::dofile(gL, itLuaFile->c_str());
	}

	return true;



/* 函数使用案例:

vector luaFiles;//GetLuaFileList(GetRootPath(), luaFiles);

CFileAndDirFinder cFileAndDirFinder;

//cFileAndDirFinder.FindAllDir(GetRootPath(), luaFiles);

//cFileAndDirFinder.FindAllFile(GetRootPath(), "*.txt", luaFiles);

cFileAndDirFinder.FindAllFileE(GetRootPath(), "*.txt", luaFiles);

vector::iterator it = luaFiles.begin();

for (; it!=luaFiles.end(); ++it)

{

cout << it->c_str() << endl;

}

*/

#pragma once

class CFileAndDirFinder
{
public:
	CFileAndDirFinder(void);
	~CFileAndDirFinder(void);

	// 查找当前目录下的所有目录(不包括当前目录)
	void FindAllDir(const char* pCurDir, vector& vtDirs);
	// 查找当前目录下的所有文件(不包括子目录),制定查找文件类型,如:*.txt,*.lua,*.*
	void FindAllFile(const char* pCurDir, const char* pFileType, vector& vtFiles);
	// 查找当前目录下的所有文件(包括子目录),制定查找文件类型,如:*.txt,*.lua,*.*
	void FindAllFileE(const char* pCurDir, const char* pFileType, vector& vtFiles);

};

/* 函数使用案例:
	vector luaFiles;
	//GetLuaFileList(GetRootPath(), luaFiles);
	CFileAndDirFinder cFileAndDirFinder;
	//cFileAndDirFinder.FindAllDir(GetRootPath(), luaFiles);
	//cFileAndDirFinder.FindAllFile(GetRootPath(), "*.txt", luaFiles);
	cFileAndDirFinder.FindAllFileE(GetRootPath(), "*.txt", luaFiles);

	vector::iterator it = luaFiles.begin();
	for (; it!=luaFiles.end(); ++it)
	{
	cout << it->c_str() << endl;
	}
*/

#include "StdAfx.h"
#include "FileAndDirFinder.h"

CFileAndDirFinder::CFileAndDirFinder(void)
{
}

CFileAndDirFinder::~CFileAndDirFinder(void)
{
}

void CFileAndDirFinder::FindAllDir( const char* pCurDir, vector& vtDirs )
{
	// 当前目录
	char szDir[MAX_PATH] = {0};
	_snprintf(szDir, MAX_PATH, "%s\\*.*", pCurDir);

	WIN32_FIND_DATA findFileData = {0};
	HANDLE hFind = FindFirstFile((LPCSTR)szDir, &findFileData);

	if (INVALID_HANDLE_VALUE == hFind)
	{
		return ;
	}

	do
	{
		/* 返回的文件名中会包含"."和".."。“.'代表本目录,".."代表上一层目录。
		一般情况下需要把这两个名称过滤掉。比如要进行文件删除操作
		*/
		if (findFileData.cFileName[0] != '.')	//不是当前路径或者父目录的快捷方式
		{
			if(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				// 这是一个普通目录
				char tmpDir[MAX_PATH] = {0};
				_snprintf(tmpDir, MAX_PATH, "%s\\%s", pCurDir, findFileData.cFileName);
				vtDirs.push_back(tmpDir);

				// 递归调用查找子目录
				FindAllDir(tmpDir, vtDirs);
			}
		}
	}while (FindNextFile(hFind, &findFileData));

	FindClose(hFind);
	hFind = INVALID_HANDLE_VALUE;
}

void CFileAndDirFinder::FindAllFile( const char* pCurDir, const char* pFileType, vector& vtFiles )
{
	// 当前目录
	char szDir[MAX_PATH] = {0};
	_snprintf(szDir, MAX_PATH, "%s\\%s", pCurDir, pFileType);

	WIN32_FIND_DATA findFileData = {0};
	HANDLE hFind = FindFirstFile((LPCSTR)szDir, &findFileData);

	if (INVALID_HANDLE_VALUE == hFind)
	{
		return ;
	}

	do
	{
		/* 返回的文件名中会包含"."和".."。“.'代表本目录,".."代表上一层目录。
		一般情况下需要把这两个名称过滤掉。比如要进行文件删除操作
		*/
		if (findFileData.cFileName[0] != '.')	//不是当前路径或者父目录的快捷方式
		{
			// 这是一个文件
			char tmpFile[MAX_PATH] = {0};
			_snprintf(tmpFile, sizeof(tmpFile)-1, "%s\\%s", pCurDir, findFileData.cFileName);

			vtFiles.push_back(tmpFile);
		}
	}while (FindNextFile(hFind, &findFileData));

	FindClose(hFind);
	hFind = INVALID_HANDLE_VALUE;
}

void CFileAndDirFinder::FindAllFileE( const char* pCurDir, const char* pFileType, vector& vtFiles )
{
	// 获取子目录
	vector vtDirs;
	FindAllDir(pCurDir, vtDirs);

	// 加入当前目录
	vtDirs.push_back(pCurDir);

	vector::iterator itDir = vtDirs.begin();
	for (; itDir!=vtDirs.end(); ++itDir)
	{
		FindAllFile(itDir->c_str(), pFileType, vtFiles);
	}
}


源代码下载地址:FileAndDirFinder.rar


你可能感兴趣的:(C/C++)