#include "StdAfx.h"
#include "findfile.h"
#include <algorithm>

// 查找文件的最大数量限制在nMaxLimit;
CONST size_t nMaxLimit = 0xFFFFFFFF;	//--4294967295;
// 查找文件的默认数量限制在nDefLimit;
CONST size_t nDefLimit = 0xFFFFF;	//--1048575

// 路径分隔符;
CONST TCHAR		c_pathSeparator = _T('\\');
CONST TString	s_pathSeparator = _T("\\");
CONST TString	g_sVertical = _T("|");

// 正确的扩展名及格式样列;
// 这个值最好可以从配置文件ini或xml中获取,不用在代码里写死;
CONST TString	g_sCorrectExt = _T("*.jpg|*.jpeg|*.png|*.bmp|*.cr2|*.nef|*.raw");

TString lowercase(IN const TString &Str)
{
#if 1 // 多字节生僻字下会出问题;
	TString sResult;
	for ( TString::const_iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			sResult.append(1, *(it++));
			sResult.append(1, *it);
		}
		else
		{
			if (_T('A') <= *it && *it <= _T('Z'))
				sResult.append(1, *it + 32);
			else
				sResult.append(1, *it);
		}
	}

	return sResult;
#else
	TString sResult;
	std::transform(Str.begin(), Str.end(), sResult.begin(), ::toupper);

	
	static CString str = _T("");
	str = Str.c_str();
	str.MakeLower();
	sResult = str.GetString();
	return sResult;
#endif
}

TString uppercase(IN const TString &Str)
{
#if 1 // 多字节生僻字下会出问题;
	TString sResult;
	for ( TString::const_iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			sResult.append(1, *(it++));
			sResult.append(1, *it);
		}
		else
		{
			if (_T('A') <= *it && *it <= _T('Z'))
				sResult.append(1, *it - 32);
			else
				sResult.append(1, *it);
		}
	}

	return sResult;
#else
	TString sResult;
	static CString strTemp = _T("");
	strTemp = Str.c_str();
	strTemp.MakeUpper();
	sResult = strTemp.GetString();
	return sResult;
#endif
}

TString getfilename(IN CONST TString &file)
{
	TString name;
	TString strfile = file;
	int nIndex = strfile.find_last_of(_T('\\'));	// 如果file不包含 '\\' ,得不到文件名;
	if (nIndex == TString::npos)
	{
		nIndex = strfile.find_last_of(_T('.'));
		if ( nIndex == TString::npos )
			return _T("");

		return strfile.substr(0, nIndex);
	}

	name = strfile.substr(nIndex+1);
	nIndex = name.find_last_of(_T('.'));
	if (nIndex == TString::npos)
		return _T("");

	return name.substr(0, nIndex);
}

// 判断指定字符串是否在数组里（不区分大小写）;
BOOL IsStringExistNoCase(IN CONST TString& str, IN STR_VEC &tagVt)
{
	int nSize = tagVt.size();
	if (nSize == 0) return FALSE;

	BOOL bExist = FALSE;
	TString stmp1 = uppercase(str);
	TString stmp2;
	for (STR_VEC::iterator it = tagVt.begin(); it != tagVt.end(); it++)
	{
		stmp2 = uppercase(*it);
		if (stmp1.compare(stmp2) == 0)
		{
			bExist = TRUE;
			break;
		}
	}

	return bExist;
}

findfile::findfile(void):
m_nlimit(nDefLimit),
m_pvtfiles(NULL),
m_pvtnames(NULL),
m_pvtfolders(NULL),
m_pvtfiles_sth(NULL),
m_pvtfiles_mth(NULL)
{
	groupExt();
}

findfile::~findfile(void)
{
}

/************************************************************************/
/*  函数：groupExt[2/19/2017 Jeff];
/*  描述：将字符串后缀名按"|"符号分隔成数组;
/*  参数：;
/*  	[GBL] g_sCorrectExt：全局字符串;
/*  返回：void;
/*  注意：;
/*  示例：;
/*
/*  修改：;
/*  日期：;
/*  内容：;
/************************************************************************/
void findfile::groupExt()
{
	// 将所有扩展名解析到数组里;
	INT nIndex = 0;
	TString strtmp;
	TString strEffctExt = g_sCorrectExt;
	strEffctExt.append(_T("|"));
	do
	{
		nIndex = strEffctExt.find(_T('|'));
		if (nIndex != TString::npos)
		{
			strtmp = strEffctExt.substr(0, nIndex);
			strEffctExt = strEffctExt.substr(nIndex + 1);

			if (strtmp.compare(_T("*.*")) && strtmp.size())
			{
				if ( !IsStringExistNoCase(strtmp,m_vtEffctExt) )
					m_vtEffctExt.push_back(strtmp);
			}
		}
	} while (strEffctExt.find(_T('|')) != TString::npos);
}

/************************************************************************/
/*  函数：[2/19/2017 Jeff];
/*  描述：;
/*  参数：;
/*  	[IN] ：;
/*  	[OUT] ：;
/*  	[IN/OUT] ：;
/*  返回：void;
/*  注意：;
/*  示例：;
/*
/*  修改：;
/*  日期：;
/*  内容：;
/************************************************************************/
void findfile::groupExt( IN CONST TString &exts, IN STR_VEC &vtExts )
{
	// 将所有扩展名解析到数组里;
	INT nIndex = 0;
	TString strtmp;
	TString strEffctExt = exts;
	strEffctExt.append(_T("|"));
	do
	{
		nIndex = strEffctExt.find(_T('|'));
		if (nIndex != TString::npos)
		{
			strtmp = strEffctExt.substr(0, nIndex);
			strEffctExt = strEffctExt.substr(nIndex + 1);

			if (strtmp.compare(_T("*.*")) && strtmp.size())
			{
				if ( !IsStringExistNoCase(strtmp,vtExts) )
					vtExts.push_back(strtmp);
			}
		}
	} while (strEffctExt.find(_T('|')) != TString::npos);
}

/************************************************************************/
/*  函数：iscorrectext[2/18/2017 Jeff];
/*  描述：判断指定的后缀串是否有效;
/*  参数：;
/*  	[IN] fext：输入的扩展名,fext的格式必须是:_T("*.jpg|*.jpeg|*.png|*.bmp");
/*  	[IN] lpMistakenExt：不符合要求的扩展名;
/*  	[IN/OUT] ：;
/*  返回：如果指定的扩展名符合要求,则返回TRUE,否则返回FALSE;
/*  注意：
/*       1.如果传入的扩展名包含_T("*.*"),则返回TRUE;若lpMistakenExt指针有效,记录第一次返回不符合要求的扩展名;
/*       2.fext的格式必须是:_T("*.jpg|*.jpeg|*.png|*.bmp");
/*  示例：;
/*
/*  修改：;
/*  日期：;
/*  内容：;
/************************************************************************/
BOOL findfile::iscorrectext(IN const TString &fext, OUT TString* lpMistakenExt /*= NULL*/)
{
	if (fext.size() == 0) return FALSE;
	if (fext.find(_T("*.*")) != TString::npos) return TRUE;

	TString ext = lowercase(fext);
	if (ext[ext.length() - 1] != _T('|'))
		ext.append(g_sVertical);

	BOOL bret = TRUE;
	int nIndex = 0;
	do
	{
		nIndex = ext.find(_T('|'));
		if (nIndex != TString::npos)
		{
			if (g_sCorrectExt.find(ext.substr(0, nIndex)) == TString::npos)
			{
				if (lpMistakenExt)
					*lpMistakenExt = ext.substr(0, nIndex);
				bret = FALSE;
				break;
			}

			ext = ext.substr(nIndex + 1);
		}
	} while (ext.find(_T('|')) != TString::npos);

	return bret;
}

/************************************************************************/
/*  函数：lowercase[2/18/2017 Jeff];
/*  描述：将指定字符串小写化;
/*  参数：;
/*  	[IN] Str：要转为小写的字符串;
/*  	[OUT] ：;
/*  	[IN/OUT] ：;
/*  返回：返回转小写后的字符串;
/*  注意：;
/*  示例：;
/*
/*  修改：;
/*  日期：;
/*  内容：;
/************************************************************************/
TString findfile::lowercase(IN const TString &Str)
{
	TString sResult;
	for ( TString::const_iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			sResult.append(1, *(it++));
			sResult.append(1, *it);
		}
		else
		{
			if (_T('A') <= *it && *it <= _T('Z'))
				sResult.append(1, *it + 32);
			else
				sResult.append(1, *it);
		}
	}

	return sResult;
}

void findfile::lowercase(IN TString& Str)
{
	for ( TString::iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			it++;
		}
		else
		{
			if (_T('A') <= *it && *it <= _T('Z'))
				*it += 32;
		}
	}
}

/************************************************************************/
/*  函数：uppercase[2/18/2017 Jeff];
/*  描述：将指定字符串大写化;
/*  参数：;
/*  	[IN] Str：要转为大写的字符串;
/*  	[OUT] ：;
/*  	[IN/OUT] ：;
/*  返回：返回转大写后的字符串;
/*  注意：;
/*  示例：;
/*
/*  修改：;
/*  日期：;
/*  内容：;
/************************************************************************/
TString findfile::uppercase(IN const TString &Str)
{
	TString sResult;
	for ( TString::const_iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			sResult.append(1, *(it++));
			sResult.append(1, *it);
		}
		else
		{
			if (_T('a') <= *it && *it <= _T('z'))
				sResult.append(1, *it - 32);
			else
				sResult.append(1, *it);
		}
	}

	return sResult;
}

void findfile::uppercase(IN TString& Str)
{
	for ( TString::iterator it = Str.begin(); it != Str.end(); it++ )
	{
		if ( *it < 0 )
		{// 小于0,含中文,什么都不做;
			it++;
		}
		else
		{
			if (_T('a') <= *it && *it <= _T('z'))
				*it -= 32;
		}
	}
}

/************************************************************************/
/*
函数:match
描述:判断指定的文件命名是否匹配指定的扩展名;
参数:
IN	sFileExt	扩展名;
IN	sFile		文件名;
返回:匹配返回非0值,否则返回0;
注意:
*/
/************************************************************************/
void findfile::setlimit(IN CONST INT &nLimit)
{
	if (nLimit < 1)
		m_nlimit = nDefLimit;
	if (nLimit < nMaxLimit)
		m_nlimit = nLimit;
}



// 获取文件名;
TString findfile::getfilename(IN CONST TString &file)
{
	TString name;
	TString strfile = file;
	int nIndex = strfile.find_last_of(_T('\\'));	// 如果file不包含 '\\' ,得不到文件名;
	if (nIndex == TString::npos)
	{
		nIndex = strfile.find_last_of(_T('.'));
		if ( nIndex == TString::npos )
			return _T("");

		return strfile.substr(0, nIndex);
	}

	name = strfile.substr(nIndex+1);
	nIndex = name.find_last_of(_T('.'));
	if (nIndex == TString::npos)
		return _T("");

	return name.substr(0, nIndex);
}

// 全部;
void findfile::findall(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
					findall(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit())
					{
						m_pvtnames->push_back(fileinfo.cFileName);
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}

		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findsubfolder(IN CONST TString& folder)	// 查找子目录;
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findallsubfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
					findallsubfolder(path + fileinfo.cFileName); // 不入子目录查找;
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

//////////////////////////////////////////////////////////////////////////
void findfile::findfiles_findin_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					findfiles_findin_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit())
					{
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findfiles_findout_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					if (!checklimit())
					{
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findfiles_within_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
					findfiles_within_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit())
					{
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

//////////////////////////////////////////////////////////////////////////
void findfile::findnames_findin_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					findnames_findin_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit() )
					{
						m_pvtnames->push_back(fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findnames_findout_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					if (!checklimit())
					{
						m_pvtnames->push_back(fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findnames_within_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
					findnames_within_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit())
					{
						m_pvtnames->push_back(fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

//////////////////////////////////////////////////////////////////////////
void findfile::findfilesnames_findin_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					findfilesnames_findin_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit() )
					{
						m_pvtnames->push_back(fileinfo.cFileName);
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}
		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findfilesnames_findout_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					if (!checklimit() )
					{
						m_pvtnames->push_back(fileinfo.cFileName);
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}

		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}

void findfile::findfilesnames_within_subfolder(IN CONST TString& folder)
{
	TString path = folder;
	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
		path.append(s_pathSeparator);

	TString file = _T("*");
	TString s = path + file;

	WIN32_FIND_DATA fileinfo = { 0 };
	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);

	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
	{
		do
		{
			// 检查是否超过最大数;
			if (checklimit()) break;

			// '.'和 '..'的系统文件去除;
			if (_T('.') != fileinfo.cFileName[0])
			{
				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
				{
					m_pvtfolders->push_back(path + fileinfo.cFileName);
					findfilesnames_within_subfolder(path + fileinfo.cFileName);
				}
				else
				{
					if (!checklimit() )
					{
						m_pvtnames->push_back(fileinfo.cFileName);
						m_pvtfiles->push_back(path + fileinfo.cFileName);
					}
				}
			}

		} while (FindNextFile(handle, &fileinfo));

		FindClose(handle);
	}
}
