Browse Source

1、添加子项UI;
2、修复主窗口标题显示问题;

scbc.sat2 5 years ago
parent
commit
062a3ac35c

+ 280 - 100
SATHelper/SATHelper/DeviceView.cpp

@@ -36,18 +36,42 @@ BEGIN_MESSAGE_MAP(CDeviceView, CFormView)
 	ON_WM_PAINT()
 	ON_WM_PAINT()
 	ON_WM_CTLCOLOR()
 	ON_WM_CTLCOLOR()
 	ON_WM_DEVICECHANGE()
 	ON_WM_DEVICECHANGE()
+	// 全步骤截图;
 	ON_COMMAND(ID_CHECK_FULL_CUT, &CDeviceView::OnCheckFullCut)
 	ON_COMMAND(ID_CHECK_FULL_CUT, &CDeviceView::OnCheckFullCut)
-	ON_COMMAND(BTN_HAD_SOUND, &CDeviceView::OnHadSound)
-	ON_COMMAND(ID_COMBOX_OCR, &CDeviceView::OnComboxOcr)
 	ON_UPDATE_COMMAND_UI(ID_CHECK_FULL_CUT, &CDeviceView::OnUpdateCheckFullCut)
 	ON_UPDATE_COMMAND_UI(ID_CHECK_FULL_CUT, &CDeviceView::OnUpdateCheckFullCut)
+	// 有声按钮;
+	ON_COMMAND(BTN_HAD_SOUND, &CDeviceView::OnHadSound)
 	ON_UPDATE_COMMAND_UI(BTN_HAD_SOUND, &CDeviceView::OnUpdateHadSound)
 	ON_UPDATE_COMMAND_UI(BTN_HAD_SOUND, &CDeviceView::OnUpdateHadSound)
-	ON_UPDATE_COMMAND_UI(ID_COMBOX_OCR, &CDeviceView::OnUpdateComboxOcr)
-	ON_UPDATE_COMMAND_UI(ID_COMBO_PRODUCT, &CDeviceView::OnUpdateComboProduct)
-	ON_UPDATE_COMMAND_UI(ID_COMBO_UI, &CDeviceView::OnUpdateComboUi)
-	ON_UPDATE_COMMAND_UI(BTN_DEF_SOUND, &CDeviceView::OnUpdateDefSound)
+	// 声音默认按钮;
 	ON_COMMAND(BTN_DEF_SOUND, &CDeviceView::OnDefSound)
 	ON_COMMAND(BTN_DEF_SOUND, &CDeviceView::OnDefSound)
+	ON_UPDATE_COMMAND_UI(BTN_DEF_SOUND, &CDeviceView::OnUpdateDefSound)
+	// 声音等级编辑框;
+	// OCR账号下拉框;
+	ON_COMMAND(ID_COMBOX_OCR, &CDeviceView::OnComboxOcr)
+	ON_UPDATE_COMMAND_UI(ID_COMBOX_OCR, &CDeviceView::OnUpdateComboxOcr)
+	// MenuTree项目下拉框;
 	ON_COMMAND(ID_COMBO_PRODUCT, &CDeviceView::OnComboProduct)
 	ON_COMMAND(ID_COMBO_PRODUCT, &CDeviceView::OnComboProduct)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_PRODUCT, &CDeviceView::OnUpdateComboProduct)
+	// MenuTree UI下拉框;
 	ON_COMMAND(ID_COMBO_UI, &CDeviceView::OnComboUi)
 	ON_COMMAND(ID_COMBO_UI, &CDeviceView::OnComboUi)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_UI, &CDeviceView::OnUpdateComboUi)
+	// MenuTree 子UI下拉框;
+	ON_COMMAND(ID_COMBO_SUBUI, &CDeviceView::OnComboSubUi)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_SUBUI, &CDeviceView::OnUpdateComboSubUi)
+	// 信号仪1下拉框;
+	ON_COMMAND(ID_COMBO1_22293, &CDeviceView::OnCombo1_22293)
+	ON_UPDATE_COMMAND_UI(ID_COMBO1_22293, &CDeviceView::OnUpdateCombo1_22293)
+	// 信号仪2下拉框;
+	ON_COMMAND(ID_COMBO2_22293, &CDeviceView::OnCombo2_22293)
+	ON_UPDATE_COMMAND_UI(ID_COMBO2_22293, &CDeviceView::OnUpdateCombo2_22293)
+	// 信号仪1CheckBox;
+	ON_COMMAND(ID_CHECK1_22293, &CDeviceView::OnCheck1_22293)
+	ON_UPDATE_COMMAND_UI(ID_CHECK1_22293, &CDeviceView::OnUpdateCheck1_22293)
+	// 信号仪2CheckBox;
+	ON_COMMAND(ID_CHECK2_22293, &CDeviceView::OnCheck2_22293)
+	ON_UPDATE_COMMAND_UI(ID_CHECK2_22293, &CDeviceView::OnUpdateCheck2_22293)
+	//////////////////////////////////////////////////////////////////////////
+	// 对话框控件;
 	ON_BN_CLICKED(IDC_BUTTON1, &CDeviceView::OnBnClickedButton1)
 	ON_BN_CLICKED(IDC_BUTTON1, &CDeviceView::OnBnClickedButton1)
 	ON_BN_CLICKED(IDC_BUTTON2, &CDeviceView::OnBnClickedButton2)
 	ON_BN_CLICKED(IDC_BUTTON2, &CDeviceView::OnBnClickedButton2)
 	ON_BN_CLICKED(IDC_CHECK1, &CDeviceView::OnBnClickedCheck1)
 	ON_BN_CLICKED(IDC_CHECK1, &CDeviceView::OnBnClickedCheck1)
@@ -55,6 +79,7 @@ BEGIN_MESSAGE_MAP(CDeviceView, CFormView)
 	ON_CBN_SELCHANGE(IDC_COMBO1, &CDeviceView::OnCbnSelchangeCombo1)
 	ON_CBN_SELCHANGE(IDC_COMBO1, &CDeviceView::OnCbnSelchangeCombo1)
 	ON_CBN_SELCHANGE(IDC_COMBO2, &CDeviceView::OnCbnSelchangeCombo2)
 	ON_CBN_SELCHANGE(IDC_COMBO2, &CDeviceView::OnCbnSelchangeCombo2)
 	ON_WM_CREATE()
 	ON_WM_CREATE()
+	
 END_MESSAGE_MAP()
 END_MESSAGE_MAP()
 
 
 
 
@@ -171,7 +196,6 @@ void CDeviceView::ReadTreePath()
 	TCHAR szRootDir[MAX_PATH] = {0};
 	TCHAR szRootDir[MAX_PATH] = {0};
 	_stprintf_s(szRootDir, _T("%s%s"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\") );
 	_stprintf_s(szRootDir, _T("%s%s"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\") );
 
 
-
 	auto _get_dir = [](std::string dir){
 	auto _get_dir = [](std::string dir){
 		int nIndex = dir.find_last_of('\\');
 		int nIndex = dir.find_last_of('\\');
 		if (nIndex != std::string::npos)
 		if (nIndex != std::string::npos)
@@ -182,6 +206,26 @@ void CDeviceView::ReadTreePath()
 		return dir;
 		return dir;
 	};
 	};
 
 
+	auto _get_name = [](std::string dir) {
+		int pos1 = dir.find_last_of('\\');
+		if (pos1 != std::string::npos)
+		{
+			dir = dir.substr(pos1 + 1);
+			int pos2 = dir.find_last_of('.');
+			if (pos2 != std::string::npos)
+			{
+				dir = dir.substr(0, pos2);
+				int pos3 = dir.find("MenuTree_");
+				if (pos3 != std::string::npos)
+				{
+					return dir.substr(strlen("MenuTree_"));
+				}
+			}
+		}
+
+		return std::string();
+	};
+
 	// 查找根目录下的目录;
 	// 查找根目录下的目录;
 	filehelper fh;
 	filehelper fh;
 	STR_VEC vt_dir;
 	STR_VEC vt_dir;
@@ -189,16 +233,38 @@ void CDeviceView::ReadTreePath()
 	for (auto it : vt_dir )
 	for (auto it : vt_dir )
 	{
 	{
 		STR_VEC vt_subdir;
 		STR_VEC vt_subdir;
+		std::vector<UITree> vtTree;
 		fh.getsubfolder(it.c_str(), &vt_subdir);
 		fh.getsubfolder(it.c_str(), &vt_subdir);
-		m_map_tree.insert(std::pair<std::string, std::vector<std::string>>(_get_dir(it), vt_subdir));
+		for ( auto ui : vt_subdir)
+		{
+			// 查找xls文件;
+			UITree uitree;
+			uitree.ui = ui;
+			fh.getfiles_findout_subfolder(ui.c_str(), _T("*.xls"), &uitree.vtSubUI);
+			vtTree.push_back(uitree);
+		}
+
+		m_map_tree.insert(std::pair<std::string, std::vector<UITree>>(_get_dir(it), vtTree));
 	}
 	}
 
 
 	// 去除目录级;
 	// 去除目录级;
-	for (std::map<std::string, std::vector<std::string>>::iterator it = m_map_tree.begin(); it != m_map_tree.end(); it++ )
+	for (std::map<std::string, std::vector<UITree>>::iterator it = m_map_tree.begin(); it != m_map_tree.end(); it++ )
 	{
 	{
-		for (std::vector<std::string>::iterator itd = it->second.begin(); itd != it->second.end(); itd++ )
+		for (std::vector<UITree>::iterator ui = it->second.begin(); ui != it->second.end(); ui++ )
 		{
 		{
-			*itd = _get_dir(*itd);
+			ui->ui = _get_dir(ui->ui);
+			for (std::vector<std::string>::iterator xls = ui->vtSubUI.begin(); xls != ui->vtSubUI.end();)
+			{
+				*xls = _get_name(xls->c_str());
+				if ( xls->size() == 0 )
+				{
+					xls = ui->vtSubUI.erase(xls);
+				}
+				else
+				{
+					xls++;
+				}
+			}
 		}
 		}
 	}
 	}
 }
 }
@@ -402,7 +468,7 @@ void CDeviceView::OnInitialUpdate()
 		CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
 		CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
 		for (auto it : m_map_tree.find(curText.GetString())->second)
 		for (auto it : m_map_tree.find(curText.GetString())->second)
 		{
 		{
-			pStyleCombo->AddItem(it.c_str());
+			pStyleCombo->AddItem(it.ui.c_str());
 		}
 		}
 		pStyleCombo->SetEditText(m_rscfg.menutree_style.c_str());
 		pStyleCombo->SetEditText(m_rscfg.menutree_style.c_str());
 	}
 	}
@@ -476,70 +542,56 @@ void CDeviceView::OnCheckFullCut()
 }
 }
 
 
 
 
-void CDeviceView::OnHadSound()
-{
-	// TODO: 在此添加命令处理程序代码
-}
-
-
-void CDeviceView::OnComboxOcr()
-{
-	// TODO: 在此添加命令处理程序代码
-	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
-	ASSERT_VALID(pRibbon);
-	CMFCRibbonComboBox* pOcrCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBOX_OCR));
-	if (pOcrCombo)
-	{
-		// 获取当前文本项;
-		CString strOcr = pOcrCombo->GetEditText();
-		WritePrivateProfileString(_T("CurStatus"), _T("Cur_Count"), strOcr, m_szBaiduCfgPath);
-	}
-}
-
-
 void CDeviceView::OnUpdateCheckFullCut(CCmdUI* pCmdUI)
 void CDeviceView::OnUpdateCheckFullCut(CCmdUI* pCmdUI)
 {
 {
 	// TODO: 在此添加命令更新用户界面处理程序代码
 	// TODO: 在此添加命令更新用户界面处理程序代码
 	pCmdUI->SetCheck(!_tcsicmp(m_rscfg.full_cut.c_str(), _T("True")));
 	pCmdUI->SetCheck(!_tcsicmp(m_rscfg.full_cut.c_str(), _T("True")));
-
 }
 }
 
 
 
 
-void CDeviceView::OnUpdateHadSound(CCmdUI* pCmdUI)
+void CDeviceView::OnHadSound()
 {
 {
-	// TODO: 在此添加命令更新用户界面处理程序代码
+	// TODO: 在此添加命令处理程序代码
 }
 }
 
 
 
 
-void CDeviceView::OnUpdateComboxOcr(CCmdUI* pCmdUI)
+void CDeviceView::OnUpdateHadSound(CCmdUI* pCmdUI)
 {
 {
 	// TODO: 在此添加命令更新用户界面处理程序代码
 	// TODO: 在此添加命令更新用户界面处理程序代码
 }
 }
 
 
 
 
-void CDeviceView::OnUpdateComboProduct(CCmdUI* pCmdUI)
+void CDeviceView::OnDefSound()
 {
 {
-	// TODO: 在此添加命令更新用户界面处理程序代码
-	
+	// TODO: 在此添加命令处理程序代码
 }
 }
 
 
 
 
-void CDeviceView::OnUpdateComboUi(CCmdUI* pCmdUI)
+void CDeviceView::OnUpdateDefSound(CCmdUI* pCmdUI)
 {
 {
 	// TODO: 在此添加命令更新用户界面处理程序代码
 	// TODO: 在此添加命令更新用户界面处理程序代码
-	
 }
 }
 
 
 
 
-void CDeviceView::OnUpdateDefSound(CCmdUI* pCmdUI)
+void CDeviceView::OnComboxOcr()
 {
 {
-	// TODO: 在此添加命令更新用户界面处理程序代码
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pOcrCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBOX_OCR));
+	if (pOcrCombo)
+	{
+		// 获取当前文本项;
+		CString strOcr = pOcrCombo->GetEditText();
+		WritePrivateProfileString(_T("CurStatus"), _T("Cur_Count"), strOcr, m_szBaiduCfgPath);
+	}
 }
 }
 
 
 
 
-void CDeviceView::OnDefSound()
+
+void CDeviceView::OnUpdateComboxOcr(CCmdUI* pCmdUI)
 {
 {
-	// TODO: 在此添加命令处理程序代码
+	// TODO: 在此添加命令更新用户界面处理程序代码
 }
 }
 
 
 
 
@@ -557,20 +609,50 @@ void CDeviceView::OnComboProduct()
 		pStyleCombo->RemoveAllItems();
 		pStyleCombo->RemoveAllItems();
 		for (auto it : m_map_tree.find(curText.GetString())->second)
 		for (auto it : m_map_tree.find(curText.GetString())->second)
 		{
 		{
-			pStyleCombo->AddItem(it.c_str());
+			pStyleCombo->AddItem(it.ui.c_str());
 		}
 		}
 		pStyleCombo->SelectItem(0);
 		pStyleCombo->SelectItem(0);
 
 
+		// SUBUI下拉框;
+		CString strUIName = pStyleCombo->GetEditText();
+		CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+		pSubUICombo->RemoveAllItems();
+		std::vector<UITree> &ui = m_map_tree.find(curText.GetString())->second;
+		for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
+		{
+			if ( _tcsicmp(strUIName.GetString(), it->ui.c_str()) == 0 )
+			{
+				if ( it->vtSubUI.size() == 0 )
+					break;
+
+				for ( auto SubUI : it->vtSubUI )
+				{
+					pSubUICombo->AddItem(SubUI.c_str());
+				}
+
+				pSubUICombo->SelectItem(0);
+			}
+		}
+
 		// 保存结果;
 		// 保存结果;
 		CString strCurChip = pChipCombo->GetEditText();
 		CString strCurChip = pChipCombo->GetEditText();
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), strCurChip, m_szRsCfgPath);
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), strCurChip, m_szRsCfgPath);
 
 
 		CString strCurStyle = pStyleCombo->GetEditText();
 		CString strCurStyle = pStyleCombo->GetEditText();
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
+
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
 	}
 	}
 }
 }
 
 
 
 
+void CDeviceView::OnUpdateComboProduct(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
+}
+
 void CDeviceView::OnComboUi()
 void CDeviceView::OnComboUi()
 {
 {
 	// TODO: 在此添加命令处理程序代码
 	// TODO: 在此添加命令处理程序代码
@@ -579,89 +661,111 @@ void CDeviceView::OnComboUi()
 	CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
 	CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
 	if (pStyleCombo)
 	if (pStyleCombo)
 	{
 	{
+		CMFCRibbonComboBox* pChipCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_PRODUCT));
+		// UI下拉框;
+		CString curText = pChipCombo->GetEditText();
+		// SUBUI下拉框;
+		CString strUIName = pStyleCombo->GetEditText();
+		CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+		pSubUICombo->RemoveAllItems();
+		std::vector<UITree>& ui = m_map_tree.find(curText.GetString())->second;
+		for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
+		{
+			if (_tcsicmp(strUIName.GetString(), it->ui.c_str()) == 0 )
+			{
+				if (it->vtSubUI.size() == 0)
+					break;
+
+				for (auto SubUI : it->vtSubUI)
+				{
+					pSubUICombo->AddItem(SubUI.c_str());
+				}
+
+				pSubUICombo->SelectItem(0);
+			}
+		}
+
 		// UI下拉框;
 		// UI下拉框;
 		CString strCurStyle = pStyleCombo->GetEditText();
 		CString strCurStyle = pStyleCombo->GetEditText();
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
+
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
 	}
 	}
 }
 }
 
 
-
-void CDeviceView::OnBnClickedButton1()
+void CDeviceView::OnUpdateComboUi(CCmdUI* pCmdUI)
 {
 {
-	// TODO: 在此添加控件通知处理程序代码
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
 }
 }
 
 
+void CDeviceView::OnComboSubUi()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+	if (pSubUICombo)
+	{
+		// UI下拉框;
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
+	}
+}
 
 
-void CDeviceView::OnBnClickedButton2()
+void CDeviceView::OnUpdateComboSubUi(CCmdUI* pCmdUI)
 {
 {
-	// TODO: 在此添加控件通知处理程序代码
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
 }
 }
 
 
 
 
-void CDeviceView::OnBnClickedCheck1()
+void CDeviceView::OnCombo1_22293()
 {
 {
-	// TODO: 在此添加控件通知处理程序代码
-	CDevice* pDev = g_dmap.find(1)->second;
-	if (m_ck_chroma1.GetCheck())
-		pDev->Open();
-	else
-		pDev->Close();
+	// TODO: 在此添加命令处理程序代码
 }
 }
 
 
-
-void CDeviceView::OnBnClickedCheck2()
+void CDeviceView::OnUpdateCombo1_22293(CCmdUI* pCmdUI)
 {
 {
-	// TODO: 在此添加控件通知处理程序代码
-	CDevice* pDev = g_dmap.find(2)->second;
-	if (m_ck_chroma2.GetCheck())
-		pDev->Open();
-	else
-		pDev->Close();
+	// TODO: 在此添加命令更新用户界面处理程序代码
 }
 }
 
 
 
 
-void CDeviceView::OnCbnSelchangeCombo1()
+
+void CDeviceView::OnCombo2_22293()
 {
 {
-	// 保存到配置文件中;
-	int nCurSel = m_cb_chroma1.GetCurSel();
-	if ( nCurSel != CB_ERR )
-	{
-		CString strChroma1;
-		m_cb_chroma1.GetLBText(nCurSel, strChroma1);
-		WritePrivateProfileString(_T("SATHelper"), _T("chroma1"), strChroma1, m_szRsCfgPath);
+	// TODO: 在此添加命令处理程序代码
+}
 
 
-		CDevice *pDev = g_dmap.find(1)->second;
-		int port = atoi(strChroma1.Right(1).GetString());
-		if (pDev->m_iPort != port)
-		{
-			pDev->m_iPort = port;
-			pDev->Close();
-			m_ck_chroma1.SetCheck(pDev->Open());
-		}
-	}	
+void CDeviceView::OnUpdateCombo2_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
 }
 }
 
 
 
 
-void CDeviceView::OnCbnSelchangeCombo2()
+void CDeviceView::OnCheck1_22293()
 {
 {
-	int nCurSel = m_cb_chroma2.GetCurSel();
-	if (nCurSel != CB_ERR)
-	{
-		CString strChroma2;
-		m_cb_chroma2.GetLBText(nCurSel, strChroma2);
-		WritePrivateProfileString(_T("SATHelper"), _T("chroma2"), strChroma2, m_szRsCfgPath);
+	// TODO: 在此添加命令处理程序代码
+}
 
 
-		CDevice* pDev = g_dmap.find(2)->second;
-		int port = atoi(strChroma2.Right(1).GetString());
-		if (pDev->m_iPort != port)
-		{
-			pDev->m_iPort = port;
-			pDev->Close();
-			m_ck_chroma2.SetCheck(pDev->Open());
-		}
-	}
+void CDeviceView::OnUpdateCheck1_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+}
+
+void CDeviceView::OnCheck2_22293()
+{
+	// TODO: 在此添加命令处理程序代码
+}
+
+void CDeviceView::OnUpdateCheck2_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
 }
 }
 
 
+
+//////////////////////////////////////////////////////////////////////////
 // 说明:使用CFormView时,任务初始化动作都应该放在OnCreate中;
 // 说明:使用CFormView时,任务初始化动作都应该放在OnCreate中;
 // 而非放在OnInitialUpdate中执行,因为OnInitialUpdate可能被调用多次;
 // 而非放在OnInitialUpdate中执行,因为OnInitialUpdate可能被调用多次;
 int CDeviceView::OnCreate(LPCREATESTRUCT lpCreateStruct)
 int CDeviceView::OnCreate(LPCREATESTRUCT lpCreateStruct)
@@ -738,3 +842,79 @@ int CDeviceView::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 
 	return 0;
 	return 0;
 }
 }
+
+void CDeviceView::OnBnClickedButton1()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnBnClickedButton2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnBnClickedCheck1()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	CDevice* pDev = g_dmap.find(1)->second;
+	if (m_ck_chroma1.GetCheck())
+		pDev->Open();
+	else
+		pDev->Close();
+}
+
+
+void CDeviceView::OnBnClickedCheck2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	CDevice* pDev = g_dmap.find(2)->second;
+	if (m_ck_chroma2.GetCheck())
+		pDev->Open();
+	else
+		pDev->Close();
+}
+
+
+void CDeviceView::OnCbnSelchangeCombo1()
+{
+	// 保存到配置文件中;
+	int nCurSel = m_cb_chroma1.GetCurSel();
+	if ( nCurSel != CB_ERR )
+	{
+		CString strChroma1;
+		m_cb_chroma1.GetLBText(nCurSel, strChroma1);
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma1"), strChroma1, m_szRsCfgPath);
+
+		CDevice *pDev = g_dmap.find(1)->second;
+		int port = atoi(strChroma1.Right(1).GetString());
+		if (pDev->m_iPort != port)
+		{
+			pDev->m_iPort = port;
+			pDev->Close();
+			m_ck_chroma1.SetCheck(pDev->Open());
+		}
+	}	
+}
+
+
+void CDeviceView::OnCbnSelchangeCombo2()
+{
+	int nCurSel = m_cb_chroma2.GetCurSel();
+	if (nCurSel != CB_ERR)
+	{
+		CString strChroma2;
+		m_cb_chroma2.GetLBText(nCurSel, strChroma2);
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma2"), strChroma2, m_szRsCfgPath);
+
+		CDevice* pDev = g_dmap.find(2)->second;
+		int port = atoi(strChroma2.Right(1).GetString());
+		if (pDev->m_iPort != port)
+		{
+			pDev->m_iPort = port;
+			pDev->Close();
+			m_ck_chroma2.SetCheck(pDev->Open());
+		}
+	}
+}

+ 41 - 8
SATHelper/SATHelper/DeviceView.h

@@ -77,7 +77,12 @@ public:
 
 
 	//////////////////////////////////////////////////////////////////////////
 	//////////////////////////////////////////////////////////////////////////
 	// 读取menutree目录;
 	// 读取menutree目录;
-	std::map<std::string, std::vector<std::string>> m_map_tree;
+	typedef struct __UI_TREE__
+	{
+		std::string ui;
+		std::vector<std::string> vtSubUI;
+	}UITree, *pUITree;
+	std::map<std::string, std::vector<UITree>> m_map_tree;
 	void ReadTreePath();
 	void ReadTreePath();
 
 
 	// 解析json;
 	// 解析json;
@@ -95,18 +100,47 @@ public:
 	virtual void OnDraw(CDC* /*pDC*/);
 	virtual void OnDraw(CDC* /*pDC*/);
 	afx_msg void OnPaint();
 	afx_msg void OnPaint();
 	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
 	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	// 全步骤截图;
 	afx_msg void OnCheckFullCut();
 	afx_msg void OnCheckFullCut();
-	afx_msg void OnHadSound();
-	afx_msg void OnComboxOcr();
 	afx_msg void OnUpdateCheckFullCut(CCmdUI* pCmdUI);
 	afx_msg void OnUpdateCheckFullCut(CCmdUI* pCmdUI);
+	// 有声按钮;
+	afx_msg void OnHadSound();
 	afx_msg void OnUpdateHadSound(CCmdUI* pCmdUI);
 	afx_msg void OnUpdateHadSound(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateComboxOcr(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateComboProduct(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateComboUi(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateDefSound(CCmdUI* pCmdUI);
+	// 声音默认按钮;
 	afx_msg void OnDefSound();
 	afx_msg void OnDefSound();
+	afx_msg void OnUpdateDefSound(CCmdUI* pCmdUI);
+	// 声音等级编辑框;
+
+	// OCR账号下拉框;
+	afx_msg void OnComboxOcr();
+	afx_msg void OnUpdateComboxOcr(CCmdUI* pCmdUI);
+	// MenuTree项目下拉框;
 	afx_msg void OnComboProduct();
 	afx_msg void OnComboProduct();
+	afx_msg void OnUpdateComboProduct(CCmdUI* pCmdUI);
+	// MenuTree UI下拉框;
 	afx_msg void OnComboUi();
 	afx_msg void OnComboUi();
+	afx_msg void OnUpdateComboUi(CCmdUI* pCmdUI);	
+	// MenuTree 子UI下拉框;
+	afx_msg void OnComboSubUi();
+	afx_msg void OnUpdateComboSubUi(CCmdUI* pCmdUI);
+	
+	// 信号仪1下拉框;
+	afx_msg void OnCombo1_22293();
+	afx_msg void OnUpdateCombo1_22293(CCmdUI* pCmdUI);
+	// 信号仪2下拉框;
+	afx_msg void OnCombo2_22293();
+	afx_msg void OnUpdateCombo2_22293(CCmdUI* pCmdUI);
+	// 信号仪1CheckBox;
+	afx_msg void OnCheck1_22293();
+	afx_msg void OnUpdateCheck1_22293(CCmdUI* pCmdUI);
+	// 信号仪2CheckBox;
+	afx_msg void OnCheck2_22293();
+	afx_msg void OnUpdateCheck2_22293(CCmdUI* pCmdUI);
+	
+
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	//////////////////////////////////////////////////////////////////////////
+	// 对话框控件;
 	CComboBox m_cb_chroma1;
 	CComboBox m_cb_chroma1;
 	CComboBox m_cb_chroma2;
 	CComboBox m_cb_chroma2;
 	CButton m_ck_chroma1;
 	CButton m_ck_chroma1;
@@ -117,7 +151,6 @@ public:
 	afx_msg void OnBnClickedCheck2();
 	afx_msg void OnBnClickedCheck2();
 	afx_msg void OnCbnSelchangeCombo1();
 	afx_msg void OnCbnSelchangeCombo1();
 	afx_msg void OnCbnSelchangeCombo2();
 	afx_msg void OnCbnSelchangeCombo2();
-	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 };
 };
 
 
 
 

+ 2 - 2
SATHelper/SATHelper/IRControlWnd.cpp

@@ -408,8 +408,8 @@ void CIRControlWnd::ReLoadSignalXml()
 void CIRControlWnd::LoadSignals()
 void CIRControlWnd::LoadSignals()
 {
 {
 	filehelper fh;
 	filehelper fh;
-	fh.getfolderfiles((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
-	fh.getfolderfiles((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
+	fh.getfiles_findout_subfolder((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
+	fh.getfiles_findout_subfolder((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
 
 
 	// 添加到combobox中;
 	// 添加到combobox中;
 	if (Global::g_Config.bGenerics )
 	if (Global::g_Config.bGenerics )

+ 3 - 5
SATHelper/SATHelper/MainFrm.cpp

@@ -318,8 +318,6 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 		m_pDeviceView->InitialUpdateFrame(NULL, FALSE);
 		m_pDeviceView->InitialUpdateFrame(NULL, FALSE);
 		m_pDeviceView->MDIActivate();
 		m_pDeviceView->MDIActivate();
 	}
 	}
-#else
-
 #endif
 #endif
 
 
 	m_pUB530View->MDIActivate();
 	m_pUB530View->MDIActivate();
@@ -336,7 +334,7 @@ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 	//  CREATESTRUCT cs 来修改窗口类或样式
 	//  CREATESTRUCT cs 来修改窗口类或样式
 
 
 	//不把子框架标题添加到主框架标题(主框架中就不会再处理WM_SETTEXT消息)
 	//不把子框架标题添加到主框架标题(主框架中就不会再处理WM_SETTEXT消息)
-	//cs.style &= ~FWS_ADDTOTITLE;
+	cs.style &= ~FWS_ADDTOTITLE;
 
 
 	return TRUE;
 	return TRUE;
 }
 }
@@ -691,12 +689,12 @@ BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
 			if (bTopWnd == FALSE)
 			if (bTopWnd == FALSE)
 			{
 			{
 				SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
 				SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
-				SetWindowText(_T("视频采集卡-前置窗口(请按F3取消或开启前置)"));
+				SetWindowText(_T("SATHelper 视频采集卡-前置窗口(请按F3取消或开启前置)"));
 			}
 			}
 			else
 			else
 			{
 			{
 				SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//取消窗口置顶	
 				SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//取消窗口置顶	
-				SetWindowText(_T("视频采集卡-取消前置(请按F3取消或开启前置)"));
+				SetWindowText(_T("SATHelper 视频采集卡-取消前置(请按F3取消或开启前置)"));
 			}
 			}
 
 
 			bTopWnd = !bTopWnd;
 			bTopWnd = !bTopWnd;

+ 34 - 28
SATHelper/SATHelper/Resource.h

@@ -127,39 +127,45 @@
 #define ID_CHECK_HDMI                   32773
 #define ID_CHECK_HDMI                   32773
 #define ID_CHECK_YCBCR                  32773
 #define ID_CHECK_YCBCR                  32773
 #define ID_CHECK_DVID                   32774
 #define ID_CHECK_DVID                   32774
-#define ID_CHECK_DVIA                   32774
-#define ID_CHECK_COMPOSITE              32775
-#define ID_CHECK_SVIDEO                 32776
-#define ID_CHECK_SDI                    32777
-#define ID_CHECK_AUTO                   32778
-#define ID_EDIT_SOUND_LEVEL             32781
-#define ID_CHECK_FULL_CUT               32782
-#define ID_CHECK_FORMAT_MP4             32786
-#define ID_BUTTON7                      32788
-#define ID_CUT_BMP                      32790
-#define ID_CUT_JPG                      32791
-#define ID_START_RECORD                 32792
-#define ID_STOP_RECORD                  32793
-#define ID_SPIN3                        32794
-#define ID_CHECK_VERTICALLY             32796
-#define ID_CHECK_HORIONTAL              32797
-#define ID_BUTTON4                      32803
-#define ID_CHECK_SUPORT_GPU             32804
-#define ID_CHECK_FORMAT_AVI             32805
-#define ID_BUTTON6                      32805
-#define BTN_HAD_SOUND                   32807
-#define ID_COMBO_PRODUCT                32808
-#define ID_COMBO_UI                     32809
-#define ID_COMBOX_OCR                   32810
-#define ID_EDIT_COUNT                   32811
-#define BTN_DEF_SOUND                   32812
+#define ID_CHECK_DVIA                   32775
+#define ID_CHECK_COMPOSITE              32776
+#define ID_CHECK_SVIDEO                 32777
+#define ID_CHECK_SDI                    32778
+#define ID_CHECK_AUTO                   32779
+#define ID_EDIT_SOUND_LEVEL             32780
+#define ID_CHECK_FULL_CUT               32781
+#define ID_CHECK_FORMAT_MP4             32782
+#define ID_BUTTON7                      32783
+#define ID_CUT_BMP                      32784
+#define ID_CUT_JPG                      32785
+#define ID_START_RECORD                 32786
+#define ID_STOP_RECORD                  32787
+#define ID_SPIN3                        32788
+#define ID_CHECK_VERTICALLY             32789
+#define ID_CHECK_HORIONTAL              32790
+#define ID_BUTTON4                      32791
+#define ID_CHECK_SUPORT_GPU             32792
+#define ID_CHECK_FORMAT_AVI             32793
+#define ID_BUTTON6                      32794
+#define BTN_HAD_SOUND                   32795
+#define ID_COMBO_PRODUCT                32796
+#define ID_COMBO_UI                     32798
+#define ID_COMBO_SUBUI                  32799
+#define ID_COMBOX_OCR                   32800
+#define ID_EDIT_COUNT                   32801
+#define BTN_DEF_SOUND                   32802
+#define ID_COMBO2_22293                 32803
+#define ID_CHECK2_22293                 32804
+#define ID_BUTTON2                      32805
+#define ID_COMBO1_22293                 32806
+#define ID_CHECK1_22293                 32807
 
 
 // Next default values for new objects
 // Next default values for new objects
 // 
 // 
 #ifdef APSTUDIO_INVOKED
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        316
-#define _APS_NEXT_COMMAND_VALUE         32813
+#define _APS_NEXT_RESOURCE_VALUE        317
+#define _APS_NEXT_COMMAND_VALUE         32818
 #define _APS_NEXT_CONTROL_VALUE         1007
 #define _APS_NEXT_CONTROL_VALUE         1007
 #define _APS_NEXT_SYMED_VALUE           310
 #define _APS_NEXT_SYMED_VALUE           310
 #endif
 #endif

+ 11 - 6
SATHelper/SATHelper/SATHelper.rc

@@ -435,9 +435,9 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM
 CAPTION "关于 SATHelper"
 CAPTION "关于 SATHelper"
 FONT 9, "MS Shell Dlg", 0, 0, 0x1
 FONT 9, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
 BEGIN
-    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
+    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,20,20
     LTEXT           "SATHelper,版本 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
     LTEXT           "SATHelper,版本 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
-    LTEXT           "版权所有 (C) 2019",IDC_STATIC,42,26,114,8
+    LTEXT           "<自动化测试小组>版权所有 (C) 2019",IDC_STATIC,42,26,114,8
     DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
     DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
 END
 END
 
 
@@ -562,6 +562,11 @@ BEGIN
     0
     0
 END
 END
 
 
+IDD_ABOUTBOX AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 //
 //
@@ -772,11 +777,11 @@ END
 
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
 LANGUAGE 4, 2
 LANGUAGE 4, 2
-#include "res\SATHelper.rc2"  // 闂?Microsoft Visual C++ 缂傚倹鐗炵欢顐︽儍閸曨喚銈繝?
-#include "l.CHS\afxres.rc"      // 闁哄秴娲ら崳顖滅磼閸曨亝顐?
-#include "l.CHS\afxprint.rc"    // 闁瑰灚鎸稿畵?闁瑰灚鎸稿畵鍐╋紣閸曨噮娼旈悹褍瀚花?
+#include "res\SATHelper.rc2"  // 闂?Microsoft Visual C++ 缂傚倸鍊归悧鐐垫椤愶附鍎嶉柛鏇ㄥ枤閵堫偅绻?
+#include "l.CHS\afxres.rc"      // 闂佸搫绉村ú銈夊闯椤栨粎纾奸柛鏇ㄤ簼椤?
+#include "l.CHS\afxprint.rc"    // 闂佺懓鐏氶幐绋跨暤?闂佺懓鐏氶幐绋跨暤閸愨晪绱i柛鏇ㄥ櫘濞兼棃鎮硅鐎氼厾鑺?
 #if !defined(_AFXDLL)
 #if !defined(_AFXDLL)
-#include "l.CHS\afxribbon.rc"        // MFC 闁告梻鍠曢崗姗€宕犻崫鍕闁硅矇鍐ㄧ厬闁哄銈囥偒婵?
+#include "l.CHS\afxribbon.rc"        // MFC 闂佸憡姊婚崰鏇㈠礂濮椻偓瀹曠娀宕崟顒€顏梺纭呯焽閸愩劎鍘梺鍝勵棥閵堝洢鍋掑┑?
 #endif
 #endif
 #endif
 #endif
 
 

+ 9 - 9
SATHelper/SATHelper/SATHelper.vcxproj.filters

@@ -34,7 +34,7 @@
     <Filter Include="内存通信">
     <Filter Include="内存通信">
       <UniqueIdentifier>{40141f1d-97c3-4250-b0f8-212872fba529}</UniqueIdentifier>
       <UniqueIdentifier>{40141f1d-97c3-4250-b0f8-212872fba529}</UniqueIdentifier>
     </Filter>
     </Filter>
-    <Filter Include="设备管理">
+    <Filter Include="视图">
       <UniqueIdentifier>{ed995c5b-408e-413c-93ea-67ed56e847fc}</UniqueIdentifier>
       <UniqueIdentifier>{ed995c5b-408e-413c-93ea-67ed56e847fc}</UniqueIdentifier>
     </Filter>
     </Filter>
   </ItemGroup>
   </ItemGroup>
@@ -148,19 +148,19 @@
       <Filter>内存通信</Filter>
       <Filter>内存通信</Filter>
     </ClInclude>
     </ClInclude>
     <ClInclude Include="SynSerial.h">
     <ClInclude Include="SynSerial.h">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClInclude>
     </ClInclude>
     <ClInclude Include="ViewTree.h">
     <ClInclude Include="ViewTree.h">
       <Filter>DockPane</Filter>
       <Filter>DockPane</Filter>
     </ClInclude>
     </ClInclude>
     <ClInclude Include="Device.h">
     <ClInclude Include="Device.h">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClInclude>
     </ClInclude>
     <ClInclude Include="UB530View.h">
     <ClInclude Include="UB530View.h">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClInclude>
     </ClInclude>
     <ClInclude Include="DeviceView.h">
     <ClInclude Include="DeviceView.h">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClInclude>
     </ClInclude>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
@@ -252,19 +252,19 @@
       <Filter>内存通信</Filter>
       <Filter>内存通信</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="SynSerial.cpp">
     <ClCompile Include="SynSerial.cpp">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="ViewTree.cpp">
     <ClCompile Include="ViewTree.cpp">
       <Filter>DockPane</Filter>
       <Filter>DockPane</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="Device.cpp">
     <ClCompile Include="Device.cpp">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="DeviceView.cpp">
     <ClCompile Include="DeviceView.cpp">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="UB530View.cpp">
     <ClCompile Include="UB530View.cpp">
-      <Filter>设备管理</Filter>
+      <Filter>视图</Filter>
     </ClCompile>
     </ClCompile>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>

File diff suppressed because it is too large
+ 0 - 0
SATHelper/SATHelper/res/ribbon.mfcribbon-ms


+ 34 - 28
SATHelper/SATHelper/resource.h

@@ -127,39 +127,45 @@
 #define ID_CHECK_HDMI                   32773
 #define ID_CHECK_HDMI                   32773
 #define ID_CHECK_YCBCR                  32773
 #define ID_CHECK_YCBCR                  32773
 #define ID_CHECK_DVID                   32774
 #define ID_CHECK_DVID                   32774
-#define ID_CHECK_DVIA                   32774
-#define ID_CHECK_COMPOSITE              32775
-#define ID_CHECK_SVIDEO                 32776
-#define ID_CHECK_SDI                    32777
-#define ID_CHECK_AUTO                   32778
-#define ID_EDIT_SOUND_LEVEL             32781
-#define ID_CHECK_FULL_CUT               32782
-#define ID_CHECK_FORMAT_MP4             32786
-#define ID_BUTTON7                      32788
-#define ID_CUT_BMP                      32790
-#define ID_CUT_JPG                      32791
-#define ID_START_RECORD                 32792
-#define ID_STOP_RECORD                  32793
-#define ID_SPIN3                        32794
-#define ID_CHECK_VERTICALLY             32796
-#define ID_CHECK_HORIONTAL              32797
-#define ID_BUTTON4                      32803
-#define ID_CHECK_SUPORT_GPU             32804
-#define ID_CHECK_FORMAT_AVI             32805
-#define ID_BUTTON6                      32805
-#define BTN_HAD_SOUND                   32807
-#define ID_COMBO_PRODUCT                32808
-#define ID_COMBO_UI                     32809
-#define ID_COMBOX_OCR                   32810
-#define ID_EDIT_COUNT                   32811
-#define BTN_DEF_SOUND                   32812
+#define ID_CHECK_DVIA                   32775
+#define ID_CHECK_COMPOSITE              32776
+#define ID_CHECK_SVIDEO                 32777
+#define ID_CHECK_SDI                    32778
+#define ID_CHECK_AUTO                   32779
+#define ID_EDIT_SOUND_LEVEL             32780
+#define ID_CHECK_FULL_CUT               32781
+#define ID_CHECK_FORMAT_MP4             32782
+#define ID_BUTTON7                      32783
+#define ID_CUT_BMP                      32784
+#define ID_CUT_JPG                      32785
+#define ID_START_RECORD                 32786
+#define ID_STOP_RECORD                  32787
+#define ID_SPIN3                        32788
+#define ID_CHECK_VERTICALLY             32789
+#define ID_CHECK_HORIONTAL              32790
+#define ID_BUTTON4                      32791
+#define ID_CHECK_SUPORT_GPU             32792
+#define ID_CHECK_FORMAT_AVI             32793
+#define ID_BUTTON6                      32794
+#define BTN_HAD_SOUND                   32795
+#define ID_COMBO_PRODUCT                32796
+#define ID_COMBO_UI                     32798
+#define ID_COMBO_SUBUI                  32799
+#define ID_COMBOX_OCR                   32800
+#define ID_EDIT_COUNT                   32801
+#define BTN_DEF_SOUND                   32802
+#define ID_COMBO2_22293                 32803
+#define ID_CHECK2_22293                 32804
+#define ID_BUTTON2                      32805
+#define ID_COMBO1_22293                 32806
+#define ID_CHECK1_22293                 32807
 
 
 // Next default values for new objects
 // Next default values for new objects
 // 
 // 
 #ifdef APSTUDIO_INVOKED
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        316
-#define _APS_NEXT_COMMAND_VALUE         32813
+#define _APS_NEXT_RESOURCE_VALUE        317
+#define _APS_NEXT_COMMAND_VALUE         32818
 #define _APS_NEXT_CONTROL_VALUE         1007
 #define _APS_NEXT_CONTROL_VALUE         1007
 #define _APS_NEXT_SYMED_VALUE           310
 #define _APS_NEXT_SYMED_VALUE           310
 #endif
 #endif

+ 1362 - 7
SATHelper/filehelper/filehelper.cpp

@@ -1,4 +1,4 @@
-#include "stdafx.h"
+#include "StdAfx.h"
 #include "filehelper.h"
 #include "filehelper.h"
 #include <shlwapi.h>
 #include <shlwapi.h>
 
 
@@ -88,24 +88,846 @@ void filehelper::split(OUT vector<TString>& vtSplit, IN const TString str, IN co
 		vtSplit.push_back(strtmp);
 		vtSplit.push_back(strtmp);
 }
 }
 
 
+/************************************************************************/
+/*  函数:[2/19/2017 Jeff];
+/*  描述:保留指定的扩展名文件;
+/*  参数:;
+/*  	[IN] keepExt:要保留的扩展名;
+/*  	[OUT] vtfiles:要提取保留扩展名的文件数组;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void filehelper::keepdownbyext(IN const TString &keepExt, IN STR_VEC &vtfiles)
+{
+	if (keepExt.find(_T("*.*")) != TString::npos) return;
+	if (vtfiles.size() == 0) return;
+
+	// 获取复制扩展名;
+	int nIndex = 0;
+	TString strtmp;
+	TString strRemainExt(keepExt);
+	strRemainExt.append(_T("|"));
+	STR_VEC vtRemainExt;
+
+	// 将所有扩展名解析到数组里;
+	do
+	{
+		nIndex = strRemainExt.find(_T('|'));
+		if (nIndex != TString::npos)
+		{
+			strtmp = strRemainExt.substr(0, nIndex);
+			strRemainExt = strRemainExt.substr(nIndex + 1);
+
+			if (strtmp.compare(_T("*.*")))
+				vtRemainExt.push_back(strtmp);
+		}
+	} while (strRemainExt.find(_T('|')) != TString::npos);
+
+	STR_VEC vtresult;
+	// 过滤非复制扩展名的文件,同时去掉缩略图,保留指定复制扩展名的文件;
+	for (STR_VEC::iterator itExt = vtRemainExt.begin(); itExt != vtRemainExt.end(); itExt++)
+	{
+		for (STR_VEC::iterator it = vtfiles.begin(); it != vtfiles.end();)
+		{
+			if (match(itExt->substr(1), it->c_str())) 
+			{
+				vtresult.push_back(*it);
+				it = vtfiles.erase(it);
+			}
+			else
+				it++;
+		}
+	}
+
+	vtfiles.clear();
+	for ( STR_VEC::iterator it = vtresult.begin(); it != vtresult.end(); it++ )
+	{
+		vtfiles.push_back(*it);
+	}
+}
+
+void filehelper::keepdownbyext(IN const TString &keepExt, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult)
+{
+	if (keepExt.find(_T("*.*")) != TString::npos) return;
+	if (vtfiles.size() == 0) return;
+
+	// 获取复制扩展名;
+	int nIndex = 0;
+	TString strtmp;
+	TString strRemainExt(keepExt);
+	strRemainExt.append(_T("|"));
+	STR_VEC vtRemainExt;
+
+	// 将所有扩展名解析到数组里;
+	do
+	{
+		nIndex = strRemainExt.find(_T('|'));
+		if (nIndex != TString::npos)
+		{
+			strtmp = strRemainExt.substr(0, nIndex);
+			strRemainExt = strRemainExt.substr(nIndex + 1);
+
+			if (strtmp.compare(_T("*.*")))
+				vtRemainExt.push_back(strtmp);
+		}
+	} while (strRemainExt.find(_T('|')) != TString::npos);
+
+#if 0
+	// 过滤非复制扩展名的文件,同时去掉缩略图,保留指定复制扩展名的文件;
+	for (STR_VEC::iterator itExt = vtRemainExt.begin(); itExt != vtRemainExt.end(); itExt++)
+	{
+		for (STR_VEC::const_iterator it = vtfiles.begin(); it != vtfiles.end(); it++)
+		{
+			if (match(itExt->substr(1), it->c_str())) 
+			{
+				vtresult.push_back(*it);
+			}
+		}
+	}
+#else
+	STR_VEC vt_files;
+	for (STR_VEC::const_iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
+	{// 不能直接用vtresult来复制,因为如果vtresult不为空的情况下,会有异常出现;
+		vt_files.push_back(*it);
+	}
+
+	for (STR_VEC::iterator itExt = vtRemainExt.begin(); itExt != vtRemainExt.end(); itExt++)
+	{
+		for (STR_VEC::iterator it = vt_files.begin(); it != vt_files.end(); )
+		{
+			if (match(itExt->substr(1), it->c_str()))
+			{
+				vtresult.push_back(*it);
+				it = vt_files.erase(it);
+			}
+			else
+				it++;
+		}
+	}
+#endif
+}
+
+/************************************************************************/
+/*  函数:keepoutext[2/19/2017 Jeff];
+/*  描述:移除指定扩展名的文件;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void filehelper::keepoutbyext(IN const TString &removeext, IN STR_VEC &vtfiles)
+{
+	if (removeext.find(_T("*.*")) != TString::npos) return;
+	if (vtfiles.size() == 0) return;
+
+	// 获取复制扩展名;
+	int nIndex = 0;
+	TString strtmp;
+	TString strRemoveExt(removeext);
+	strRemoveExt.append(_T("|"));
+	STR_VEC vtRemoveExt;
+
+	// 将所有扩展名解析到数组里;
+	do
+	{
+		nIndex = strRemoveExt.find(_T('|'));
+		if (nIndex != TString::npos)
+		{
+			strtmp = strRemoveExt.substr(0, nIndex);
+			strRemoveExt = strRemoveExt.substr(nIndex + 1);
+
+			if (strtmp.compare(_T("*.*")))
+				vtRemoveExt.push_back(strtmp);
+		}
+	} while (strRemoveExt.find(_T('|')) != TString::npos);
+
+	// 过滤非复制扩展名的文件,同时去掉缩略图,保留指定复制扩展名的文件;
+	for (STR_VEC::iterator itExt = vtRemoveExt.begin(); itExt != vtRemoveExt.end(); itExt++)
+	{
+		for (STR_VEC::iterator it = vtfiles.begin(); it != vtfiles.end();)
+		{
+			if (match(itExt->substr(1), it->c_str())) 
+			{
+				it = vtfiles.erase(it);
+			}
+			else
+				it++;
+		}
+	}
+}
+
+void filehelper::keepoutbyext(IN const TString &removeext, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult)
+{
+	if (removeext.find(_T("*.*")) != TString::npos) return;
+	if (vtfiles.size() == 0) return;
+
+	// 获取复制扩展名;
+	int nIndex = 0;
+	TString strtmp;
+	TString strRemoveExt(removeext);
+	strRemoveExt.append(_T("|"));
+	STR_VEC vtRemoveExt;
+
+	// 将所有扩展名解析到数组里;
+	do
+	{
+		nIndex = strRemoveExt.find(_T('|'));
+		if (nIndex != TString::npos)
+		{
+			strtmp = strRemoveExt.substr(0, nIndex);
+			strRemoveExt = strRemoveExt.substr(nIndex + 1);
+
+			if (strtmp.compare(_T("*.*")))
+				vtRemoveExt.push_back(strtmp);
+		}
+	} while (strRemoveExt.find(_T('|')) != TString::npos);
+
+	// 复制到新容器中;
+	STR_VEC vt_files;
+	for (STR_VEC::const_iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
+	{// 不能直接用vtresult来复制,因为如果vtresult不为空的情况下,会有异常出现;
+		vt_files.push_back(*it);
+	}
+
+	// 过滤非复制扩展名的文件,同时去掉缩略图,保留指定复制扩展名的文件;
+	for (STR_VEC::iterator itExt = vtRemoveExt.begin(); itExt != vtRemoveExt.end(); itExt++)
+	{
+		for (STR_VEC::iterator it = vt_files.begin(); it != vt_files.end();)
+		{
+			if (match(itExt->substr(1), it->c_str()))
+			{
+				vtresult.push_back(*it);
+				it = vt_files.erase(it);
+			}
+			else
+				it++;
+		}
+	}
+}
+
+void filehelper::keepdowbyname(IN const STR_VEC &vtnames)
+{
+	if ( m_pvtfiles == NULL || m_pvtnames == &vtnames )
+		return;
+
+	INT nIndex = 0;
+	STR_VEC vt_result_files;
+	if ( m_pvtnames == NULL)
+	{
+		STR_VEC::const_iterator it_name = vtnames.begin();
+		for ( ; it_name != vtnames.end(); it_name++ )
+		{
+			STR_VEC::iterator it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(); )
+			{
+				nIndex = it_file->find_last_of(_T('\\'));
+				if (TString::npos != nIndex)
+				{
+					if (_tcsicmp(it_file->substr(nIndex + 1).c_str(), it_name->c_str()) == 0)
+					{
+						vt_result_files.push_back(*it_file);
+						it_file = m_pvtfiles->erase(it_file);
+						continue;
+					}
+				}
+				it_file++;
+			}
+		}
+
+		m_pvtfiles->clear();
+		for ( STR_VEC::iterator it = vt_result_files.begin(); it != vt_result_files.end(); it++ )
+		{
+			m_pvtfiles->push_back(*it);
+		}
+	}
+	else 
+	{
+		if ( m_pvtnames->size() != m_pvtfiles->size() )
+			return;
+
+		STR_VEC::iterator it_name;
+		STR_VEC::iterator it_file;
+		STR_VEC vt_result_names;
+		for ( STR_VEC::const_iterator it = vtnames.begin(); it != vtnames.end(); it++ )
+		{
+			it_name = m_pvtnames->begin();
+			it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(), it_name != m_pvtnames->end();)
+			{
+				if ( _tcsicmp(it_name->c_str(), it->c_str()) == 0 )
+				{
+					vt_result_files.push_back(*it_file);
+					vt_result_names.push_back(*it_name);
+					it_file = m_pvtfiles->erase(it_file);
+					it_name = m_pvtnames->erase(it_name);
+					continue;
+				}
+
+				it_file++;
+				it_name++;
+			}
+		}
+
+		m_pvtfiles->clear();
+		m_pvtnames->clear();
+		it_name = vt_result_names.begin();
+		it_file = vt_result_files.begin();
+		for ( ; it_file != vt_result_files.end(), it_name != vt_result_names.end(); it_file++, it_name++ )
+		{
+			m_pvtfiles->push_back(*it_file);
+			m_pvtnames->push_back(*it_name);
+		}
+	}
+}
+
+void filehelper::keepdowbyname(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles)
+{
+	if ( vtnames.size() == 0 )
+		return;
+
+	INT nIndex = 0;
+	STR_VEC vt_result_files;
+	STR_VEC::const_iterator it_name = vtnames.begin();
+	for ( ; it_name != vtnames.end(); it_name++ )
+	{
+		STR_VEC::iterator it_file = vtfiles.begin();
+		for ( ; it_file != vtfiles.end(); )
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			if (TString::npos != nIndex)
+			{
+				if (_tcsicmp(it_file->substr(nIndex + 1).c_str(), it_name->c_str()) == 0)
+				{
+					vt_result_files.push_back(*it_file);
+					it_file = vtfiles.erase(it_file);
+					continue;
+				}
+			
+			}
+			it_file++;
+		}
+	}
+
+	vtfiles.clear();
+	for ( STR_VEC::iterator it = vt_result_files.begin(); it != vt_result_files.end(); it++ )
+	{
+		vtfiles.push_back(*it);
+	}
+}
+
+void filehelper::keepdowbyname(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result)
+{
+	if ( vtnames.size() == 0 )
+		return;
+
+	INT nIndex = 0;
+	STR_VEC::const_iterator it_name = vtnames.begin();
+	for ( ; it_name != vtnames.end(); it_name++ )
+	{
+		STR_VEC::const_iterator it_file = vtfiles.begin();
+		for ( ; it_file != vtfiles.end(); it_file++)
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			if (TString::npos != nIndex)
+			{
+				if (_tcsicmp(it_file->substr(nIndex + 1).c_str(), it_name->c_str()) == 0)
+				{
+					vt_result.push_back(*it_file);
+				}
+			}
+		}
+	}
+}
+
+void filehelper::keepdowbyname_noext(IN const STR_VEC &vtnames)
+{
+	if ( m_pvtfiles == NULL || m_pvtnames == &vtnames )
+		return;
+
+	INT nIndex = 0;
+	STR_VEC vt_result_files;
+	if ( m_pvtnames == NULL)
+	{
+		INT nIndex2 = 0;
+		STR_VEC::const_iterator it_name = vtnames.begin();
+		for ( ; it_name != vtnames.end(); it_name++ )
+		{
+			STR_VEC::iterator it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(); )
+			{
+				nIndex = it_file->find_last_of(_T('\\'));
+				nIndex2 = it_file->find_last_of(_T('.'));
+				if (TString::npos != nIndex && TString::npos != nIndex2 && nIndex > nIndex2 )
+				{
+					if ( _tcsicmp(it_file->substr(nIndex+1,nIndex2 - nIndex - 1).c_str(), it_name->c_str()) == 0)
+					{
+						vt_result_files.push_back(*it_file);
+						it_file = m_pvtfiles->erase(it_file);
+						continue;
+					}
+				}
+				it_file++;
+			}
+		}
+
+		m_pvtfiles->clear();
+		for ( STR_VEC::iterator it = vt_result_files.begin(); it != vt_result_files.end(); it++ )
+		{
+			m_pvtfiles->push_back(*it);
+		}
+	}
+	else 
+	{
+		if ( m_pvtnames->size() != m_pvtfiles->size() )
+			return;
+
+		STR_VEC::iterator it_name;
+		STR_VEC::iterator it_file;
+		STR_VEC vt_result_names;
+		for ( STR_VEC::const_iterator it = vtnames.begin(); it != vtnames.end(); it++ )
+		{
+			it_name = m_pvtnames->begin();
+			it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(), it_name != m_pvtnames->end();)
+			{
+				if ( TString::npos != ( nIndex = it_name->find_last_of(_T('.'))))
+				{
+					if ( _tcsicmp(it_name->substr(0, nIndex).c_str(), it->c_str()) == 0 )
+					{
+						vt_result_files.push_back(*it_file);
+						vt_result_names.push_back(*it_name);
+						it_file = m_pvtfiles->erase(it_file);
+						it_name = m_pvtnames->erase(it_name);
+						continue;
+					}
+				}
+				it_file++;
+				it_name++;
+			}
+		}
+
+		m_pvtfiles->clear();
+		m_pvtnames->clear();
+		it_name = vt_result_names.begin();
+		it_file = vt_result_files.begin();
+		for ( ; it_file != vt_result_files.end(), it_name != vt_result_names.end(); it_file++, it_name++ )
+		{
+			m_pvtfiles->push_back(*it_file);
+			m_pvtnames->push_back(*it_name);
+		}
+	}
+}
+
+void filehelper::keepdowbyname_noext(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles)
+{
+	if ( vtnames.size() == 0 )
+		return;
+
+	INT nIndex = 0;
+	TString strName;
+	STR_VEC vt_result_files;
+	STR_VEC::const_iterator it_name = vtnames.begin();
+	for ( ; it_name != vtnames.end(); it_name++ )
+	{
+		STR_VEC::iterator it_file = vtfiles.begin();
+		for ( ; it_file != vtfiles.end(); )
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			if (TString::npos != nIndex)
+			{
+				strName = it_file->substr(nIndex+1);
+				if ( TString::npos != ( nIndex = strName.find_last_of(_T('.'))))
+				{
+					if ( _tcsicmp(strName.substr(0,nIndex).c_str(), it_name->c_str()) == 0)
+					{
+						vt_result_files.push_back(*it_file);
+						it_file = vtfiles.erase(it_file);
+						continue;
+					}
+				}
+			}
+			it_file++;
+		}
+	}
+
+	vtfiles.clear();
+	for ( STR_VEC::iterator it = vt_result_files.begin(); it != vt_result_files.end(); it++ )
+	{
+		vtfiles.push_back(*it);
+	}
+}
+
+void filehelper::keepdowbyname_noext(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result)
+{
+	if ( vtnames.size() == 0 )
+		return;
+
+	INT nIndex = 0;
+	TString strName;
+	STR_VEC::const_iterator it_name = vtnames.begin();
+	for ( ; it_name != vtnames.end(); it_name++ )
+	{
+		STR_VEC::const_iterator it_file = vtfiles.begin();
+		for ( ; it_file != vtfiles.end(); it_file++)
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			if (TString::npos != nIndex)
+			{
+				strName = it_file->substr(nIndex+1);
+				if ( TString::npos != ( nIndex = strName.find_last_of(_T('.'))))
+				{
+					if ( _tcsicmp(strName.substr(0,nIndex).c_str(), it_name->c_str()) == 0)
+					{
+						vt_result.push_back(*it_file);
+					}
+				}
+			}
+		}
+	}
+}
+
+void filehelper::subgroupExt(IN const TString &ext1, IN STR_VEC &vt1, IN const TString &ext2, IN STR_VEC &vt2)
+{
+	// 		if (ext1.find(_T("*.*")) != TString::npos ) return;
+	// 		if ( !iscorrectext(ext1) || vt1.size() == 0 ) return;
+	// 
+	// 		// 获取复制扩展名;
+	// 		int nIndex = 0;
+	// 		TString strtmp;
+	// 		TString strExt1(ext1);
+	// 		strExt1.append(_T("|"));
+	// 		STR_VEC vtExt1;
+	// 
+	// 		// 将所有扩展名解析到数组里;
+	// 		do 
+	// 		{
+	// 			nIndex = strExt1.find(_T('|'));
+	// 			if ( nIndex != TString::npos )
+	// 			{
+	// 				strtmp = strExt1.substr(0,nIndex);
+	// 				strExt1 = strExt1.substr(nIndex+1);
+	// 
+	// 				if(strtmp.compare(_T("*.*")))
+	// 					vtExt1.push_back(strtmp);
+	// 			}
+	// 		} while ( strExt1.find(_T('|')) != TString::npos );
+}
+
+/************************************************************************/
+/*  函数:filterbyname[2/21/2017 Jeff];
+/*  描述:根据有后缀的文件名(如:001.jpg)来过虑文件;;
+/*  参数:;
+/*  	[IN] vtfiles:要被过滤的文件路径数组;
+/*  	[IN] vtnames:要过滤的文件名,每个文件名都有后缀,如:001.jpg;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void filehelper::filterbyname(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames)
+{// 再按名称过滤;
+	INT nIndex = 0;
+	TString strName;
+	for ( STR_VEC::const_iterator it_name = vtnames.begin(); it_name != vtnames.end(); it_name++ )
+	{
+		for ( STR_VEC::iterator it_file = vtfiles.begin(); it_file != vtfiles.end(); )
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			if (TString::npos != nIndex)
+			{
+				strName = it_file->substr(nIndex+1);
+				if ( _tcsicmp(strName.c_str(), it_name->c_str()) == 0 )
+				{
+					it_file = vtfiles.erase(it_file);
+					continue;
+				}				
+			}
+			it_file++;
+		}
+	}
+}
+
+void filehelper::filterbyname(IN const STR_VEC &vtnames)
+{
+	if ( m_pvtfiles == NULL || m_pvtnames == &vtnames )
+		return;
+
+	INT nIndex = 0;
+	TString strName;
+	if ( m_pvtnames == NULL)
+	{
+		STR_VEC::const_iterator it_name = vtnames.begin();
+		for ( ; it_name != vtnames.end(); it_name++ )
+		{
+			STR_VEC::iterator it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(); )
+			{
+				nIndex = it_file->find_last_of(_T('\\'));
+				if (TString::npos != nIndex)
+				{
+					strName = it_file->substr(nIndex+1);
+					if ( _tcsicmp(strName.c_str(), it_name->c_str()) == 0)
+					{
+						it_file = m_pvtfiles->erase(it_file);
+						continue;
+					}
+				}
+				it_file++;
+			}
+		}
+	}
+	else 
+	{
+		if ( m_pvtnames->size() != m_pvtfiles->size() )
+			return;
+		for ( STR_VEC::const_iterator it = vtnames.begin(); it != vtnames.end(); it++ )
+		{
+			STR_VEC::iterator it_name = m_pvtnames->begin();
+			STR_VEC::iterator it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(), it_name != m_pvtnames->end();)
+			{
+				if ( _tcsicmp(it_name->c_str(), it->c_str()) == 0 )
+				{
+					it_file = m_pvtfiles->erase(it_file);
+					it_name = m_pvtnames->erase(it_name);
+					continue;
+				}
+
+				it_file++;
+				it_name++;
+			}
+		}
+	}
+}
+
+// 根据无后缀的文件名(如:001)来过虑文件;
+void filehelper::filterbyname_noext(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames)
+{// 再按名称过滤;
+	INT nIndex = 0;
+	INT nIndex2 = 0;
+	TString strName;
+	for ( STR_VEC::iterator it_file = vtfiles.begin(); it_file != vtfiles.end(); )
+	{
+		nIndex = it_file->find_last_of(_T('\\'));
+		nIndex2 = it_file->find_last_of(_T('.'));
+		for ( STR_VEC::const_iterator it_name = vtnames.begin(); it_name != vtnames.end(); it_name++ )
+		{
+			if (TString::npos != nIndex && TString::npos != nIndex2 && nIndex2 > nIndex)
+			{
+				if ( _tcsicmp(it_file->substr(nIndex+1,nIndex2-nIndex-1).c_str(), it_name->c_str()) == 0)
+				{
+					it_file = vtfiles.erase(it_file);
+					continue;
+				}
+			}
+			it_file++;
+		}
+	}
+}
+
+void filehelper::filterbyname_noext(IN const STR_VEC &vtnames)
+{
+	if ( m_pvtfiles == NULL || m_pvtnames == &vtnames )
+		return;
+
+	INT nIndex = 0;
+	TString strName;
+	if ( m_pvtnames == NULL )
+	{
+		INT nIndex2 = 0;
+		STR_VEC::iterator it_file = m_pvtfiles->begin();
+		for ( ; it_file != m_pvtfiles->end(); )
+		{
+			nIndex = it_file->find_last_of(_T('\\'));
+			nIndex2 = it_file->find_last_of(_T('.'));
+			for ( STR_VEC::const_iterator it_name = vtnames.begin(); it_name != vtnames.end(); it_name++ )
+			{
+				if (TString::npos != nIndex && TString::npos != nIndex2 && nIndex2 > nIndex)
+				{
+					if ( _tcsicmp(it_file->substr(nIndex+1,nIndex2-nIndex-1).c_str(), it_name->c_str()) == 0 )
+					{
+						it_file = m_pvtfiles->erase(it_file);
+						continue;
+					}
+				}
+				it_file++;
+			}
+		}
+	}
+	else
+	{
+		if (m_pvtnames->size() != m_pvtfiles->size())
+			return;
+
+		for ( STR_VEC::const_iterator it = vtnames.begin(); it != vtnames.end(); it++ )
+		{
+			STR_VEC::iterator it_name = m_pvtnames->begin();
+			STR_VEC::iterator it_file = m_pvtfiles->begin();
+			for ( ; it_file != m_pvtfiles->end(), it_name != m_pvtnames->end();)
+			{
+				if ( TString::npos != (nIndex = it_name->find_last_of(_T('.'))) )
+				{
+					if ( _tcsicmp(it_name->substr(0, nIndex).c_str(), it->c_str()) == 0 )
+					{
+						it_file = m_pvtfiles->erase(it_file);
+						it_name = m_pvtnames->erase(it_name);
+						continue;
+					}
+
+					it_file++;
+					it_name++;
+				}
+			}
+		}
+	}
+
+}
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::getall(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN OUT STR_VEC *pvtfiles, IN OUT STR_VEC *pvtnames, IN OUT STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (!pvtfiles || !pvtnames || !pvtfolders ) return FALSE;
+
+	m_pvtfiles = pvtfiles;
+	m_pvtnames = pvtnames;
+	m_pvtfolders = pvtfolders;
+
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+
+	findall(lpfolder);
+	if ( _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+		keepdownbyext(lpfindext, *pvtnames);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getsubfolder(IN LPCTSTR lpfolder, IN STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfolders == NULL) return FALSE;
+	m_pvtfolders = pvtfolders;
+
+	findsubfolder(lpfolder);
+
+	return TRUE;
+}
+
+BOOL filehelper::getallsubfolder(IN LPCTSTR lpfolder, IN STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfolders == NULL) return FALSE;
+	m_pvtfolders = pvtfolders;
+
+	findallsubfolder(lpfolder);
+
+	return TRUE;
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-BOOL filehelper::getsubfolder(LPCTSTR lpfolder, STR_VEC *pvtfolders)
+BOOL filehelper::getfiles_findin_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
+
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfiles_findin_subfolder(lpfolder);
+	if ( _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getfiles_findout_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfiles_findout_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getfiles_within_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtfolders)
 {
 {
 	// 路径不存在;
 	// 路径不存在;
 	if (!PathFileExists(lpfolder))
 	if (!PathFileExists(lpfolder))
 		return FALSE;
 		return FALSE;
 
 
 	// 指针空;
 	// 指针空;
-	if (pvtfolders == NULL) return FALSE;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
 	m_pvtfolders = pvtfolders;
 	m_pvtfolders = pvtfolders;
-
-	findsubfolder(lpfolder);
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfiles_within_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
 
 
 	return TRUE;
 	return TRUE;
 }
 }
 
 
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-BOOL filehelper::getallfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pvtfiles)
+BOOL filehelper::getfiles_bynames_findin_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN STR_VEC *pvtfiles )
 {
 {
 	// 路径不存在;
 	// 路径不存在;
 	if (!PathFileExists(lpfolder))
 	if (!PathFileExists(lpfolder))
@@ -115,12 +937,23 @@ BOOL filehelper::getallfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pvtfi
 	if (pvtfiles == NULL) return FALSE;
 	if (pvtfiles == NULL) return FALSE;
 	m_pvtfiles = pvtfiles;
 	m_pvtfiles = pvtfiles;
 
 
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
 	findfiles_findin_subfolder(lpfolder);
 	findfiles_findin_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	// 再按名称过滤;
+	filterbyname(*pvtfiles, vtnames);
 
 
 	return TRUE;
 	return TRUE;
 }
 }
 
 
-BOOL filehelper::getfolderfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pvtfiles)
+BOOL filehelper::getfiles_bynames_findout_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN OUT STR_VEC *pvtfiles )
 {
 {
 	// 路径不存在;
 	// 路径不存在;
 	if (!PathFileExists(lpfolder))
 	if (!PathFileExists(lpfolder))
@@ -130,7 +963,529 @@ BOOL filehelper::getfolderfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pv
 	if (pvtfiles == NULL) return FALSE;
 	if (pvtfiles == NULL) return FALSE;
 	m_pvtfiles = pvtfiles;
 	m_pvtfiles = pvtfiles;
 
 
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+
 	findfiles_findout_subfolder(lpfolder);
 	findfiles_findout_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	// 再按名称过滤;
+	filterbyname(*pvtfiles, vtnames);
+
+	return TRUE;
+}
+
+BOOL filehelper::getfiles_bynames_within_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN STR_VEC *pvtfiles, IN STR_VEC *pvtfolders )
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
+	m_pvtfolders = pvtfolders;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+
+	findfiles_within_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	// 再按名称过滤;
+	filterbyname(*pvtfiles, vtnames);
+
+	return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::getnames_findin_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtnames)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames == NULL) return FALSE;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	m_pvtnames = pvtnames;
+	findnames_findin_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *m_pvtnames);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getnames_findout_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtnames)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames == NULL) return FALSE;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	m_pvtnames = pvtnames;
+	findnames_findout_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *m_pvtnames);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getnames_within_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtnames, IN STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames == NULL || pvtfolders == NULL ) 
+		return FALSE;
+
+	m_pvtfolders = pvtfolders;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	m_pvtnames = pvtnames;
+	m_pvtfolders = pvtfolders;
+	findnames_within_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *m_pvtnames);
+	}
+
+	return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::getfilesnames_findin_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames || !pvtnames) return FALSE;
+	m_pvtfiles = pvtfiles;
+	m_pvtnames = pvtnames;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfilesnames_findin_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtnames);
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getfilesnames_findout_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames || !pvtnames) return FALSE;
+	m_pvtfiles = pvtfiles;
+	m_pvtnames = pvtnames;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfilesnames_findout_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtnames);
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
+
+	return TRUE;
+}
+
+BOOL filehelper::getfilesnames_within_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames, IN STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtnames || !pvtnames) return FALSE;
+	m_pvtfiles = pvtfiles;
+	m_pvtnames = pvtnames;
+	m_pvtfolders = pvtfolders;
+#if	USE_IMGEXT
+	// 判断扩展名有效性;
+	if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+	findfilesnames_within_subfolder(lpfolder);
+	if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+	{// 需要保留指定后缀;
+		keepdownbyext(lpfindext, *pvtnames);
+		keepdownbyext(lpfindext, *pvtfiles);
+	}
 
 
 	return TRUE;
 	return TRUE;
 }
 }
+
+#if 1
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::comparename_2file(IN LPCTSTR file1, IN LPCTSTR file2)
+{
+	if (!file1 || !file2) return FALSE;
+
+	if (!PathFileExists(file1) || !PathFileExists(file2))
+		return FALSE;
+
+	TString strfile1 = file1;
+	TString strfile2 = file2;
+
+	strfile1 = getfilename(strfile1);
+	strfile2 = getfilename(strfile2);
+
+	return !strfile1.compare(strfile2);
+}
+
+BOOL filehelper::comparename_findin_names(IN LPCTSTR name)
+{
+	if (!m_pvtnames || !name) return FALSE;
+	for (STR_VEC::iterator it = m_pvtnames->begin(); it != m_pvtnames->end(); it++)
+	{
+		if ( _tcsicmp(name, it->c_str()) == 0)
+		{
+			// 打印日志,或提示用户同名文件路径在哪;
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+BOOL filehelper::comparename_findin_names(IN LPCTSTR name, IN STR_VEC &vtnames)
+{
+	if (!name) return FALSE;
+	for (STR_VEC::iterator it = vtnames.begin(); it != vtnames.end(); it++)
+	{
+		if ( _tcsicmp(name, it->c_str()) == 0)
+		{
+			// 打印日志,或提示用户同名文件路径在哪;
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+BOOL filehelper::comparename_findin_files(IN LPCTSTR name, IN STR_VEC &vtfiles)
+{
+	if (!name) return FALSE;
+
+	int nIndex = 0;
+	for (STR_VEC::iterator it = vtfiles.begin(); it != vtfiles.end(); it++)
+	{
+		if ((nIndex = it->find_last_of(_T('\\'))) != TString::npos)
+		{
+			if (_tcsicmp(name, it->substr(nIndex+1).c_str()) == 0)
+			{
+				// 打印日志,或提示用户同名文件路径在哪;
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
+
+BOOL filehelper::comparename_findin_folder(IN LPCTSTR name, IN LPCTSTR folder, IN LPCTSTR findext, IN BOOL bsubfolder)
+{
+#if	USE_IMGEXT
+	if (!name || !iscorrectext(findext)) return FALSE;
+#else
+	if ( !name ) return FALSE;
+#endif
+	STR_VEC vtnames;
+	if (bsubfolder)
+	{
+		if (!getnames_findin_subfolder(folder, findext, &vtnames))
+			return FALSE;
+	}
+	else
+	{
+		if (!getnames_findout_subfolder(folder, findext, &vtnames))
+			return FALSE;
+	}
+
+	return comparename_findin_names(name, vtnames);
+}
+
+INT filehelper::comparenames_findin_names(IN STR_VEC vtSrcnames, IN STR_VEC vtDesnames, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	if (vtSrcnames.size() == 0 || vtDesnames.size() == 0) return 0;
+
+	INT nCount = 0;
+	for (STR_VEC::iterator it1 = vtSrcnames.begin(); it1 != vtSrcnames.end(); it1++)
+	{
+		for (STR_VEC::iterator it2 = vtDesnames.begin(); it2 != vtDesnames.end(); it2++)
+		{
+			if (_tcsicmp(it1->c_str(), it2->c_str()) == 0)
+			{
+				nCount++;
+				if (pvtIsonym)
+					pvtIsonym->push_back(*it1);
+
+				break;
+			}
+		}
+	}
+
+	return nCount;
+}
+
+INT filehelper::comparenames_findin_files(IN STR_VEC vtnames, IN STR_VEC vtfiles, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	if (vtnames.size() == 0 || vtfiles.size() == 0) return 0;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return 0;
+#endif
+	INT nCount = 0;
+	for (STR_VEC::iterator it = vtnames.begin(); it != vtnames.end(); it++)
+	{
+		if (comparename_findin_files(it->c_str(), vtfiles))
+		{
+			if (pvtIsonym)
+				pvtIsonym->push_back(*it);
+			nCount++;
+		}
+	}
+
+	return nCount;
+}
+
+INT filehelper::comparenames_findin_folder(IN STR_VEC vtnames, IN LPCTSTR folder, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	if (vtnames.size() == 0 || !PathFileExists(folder)) return 0;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return 0;
+#endif
+	STR_VEC vtnames2;
+	if (bsubfolder)
+	{
+		getnames_findin_subfolder(folder, findext, &vtnames2);
+	}
+	else
+	{
+		getnames_findout_subfolder(folder, findext, &vtnames2);
+	}
+
+	return comparenames_findin_names(vtnames, vtnames2, pvtIsonym);
+}
+
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::comparefile_findin_names(IN LPCTSTR file, IN STR_VEC& vtnames)
+{
+	if (vtnames.size() == 0) return FALSE;
+	if (!file || !PathFileExists(file)) return FALSE;
+
+	TString strfile = file;
+	TString name = getfilename(strfile);
+
+	return comparename_findin_names(name.c_str(), vtnames);
+}
+
+BOOL filehelper::comparefile_findin_files(IN LPCTSTR file, IN STR_VEC& vtfiles, IN LPCTSTR findext)
+{
+	if (!file || !PathFileExists(file)) return FALSE;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return FALSE;
+#endif
+	TString strfile = file;
+	TString name = getfilename(strfile);
+
+	// 过滤掉不需要的扩展名;
+	keepdownbyext(findext, vtfiles);
+
+	return comparename_findin_files(name.c_str(), vtfiles);
+}
+
+BOOL filehelper::comparefile_findin_folder(IN LPCTSTR file, IN LPCTSTR folder, IN BOOL bsubfolder, IN LPCTSTR findext)
+{
+	if (!file || !PathFileExists(file) || !folder || !PathFileExists(folder)) return FALSE;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return FALSE;
+#endif
+	TString strfile = file;
+	TString name = getfilename(strfile);
+
+	STR_VEC vtnames;
+	if (bsubfolder)
+	{
+		getnames_findin_subfolder(folder, findext, &vtnames);
+	}
+	else
+	{
+		getnames_findout_subfolder(folder, findext, &vtnames);
+	}
+
+	return comparename_findin_names(name.c_str(), vtnames);
+}
+
+INT filehelper::comparefiles_findin_files(IN STR_VEC &vtfiles1, IN STR_VEC &vtfiles2, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	if (vtfiles1.size() == 0 || vtfiles2.size() == 0) return 0;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return 0;
+#endif
+	// 过滤掉不需要的扩展名;
+	keepdownbyext(findext, vtfiles1);
+
+	// 过滤掉不需要的扩展名;
+	keepdownbyext(findext, vtfiles2);
+
+	INT nCount = 0;
+	TString name;
+	for (STR_VEC::iterator it = vtfiles1.begin(); it != vtfiles1.end(); it++)
+	{
+		name = getfilename(*it);
+		if (comparename_findin_files(name.c_str(), vtfiles2))
+		{
+			if (pvtIsonym)
+				pvtIsonym->push_back(name);
+			nCount++;
+		}
+	}
+
+	return nCount;
+}
+
+INT filehelper::comparefiles_findin_folder(IN STR_VEC &vtfiles, IN LPCTSTR folder, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	if (vtfiles.size() == 0 || !folder || !PathFileExists(folder)) return 0;
+#if	USE_IMGEXT
+	if (!iscorrectext(findext)) return 0;
+#endif
+	STR_VEC vtnames;
+	if (bsubfolder)
+	{
+		getnames_findin_subfolder(folder, findext, &vtnames);
+	}
+	else
+	{
+		getnames_findout_subfolder(folder, findext, &vtnames);
+	}
+
+	return comparenames_findin_files(vtnames, vtfiles, findext, pvtIsonym);
+}
+
+INT filehelper::comparefolderself(IN LPCTSTR folder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	OutputDebugString(_T("\n"));
+#if	USE_IMGEXT
+	if (!folder || !PathFileExists(folder) || !iscorrectext(findext)) return 0;
+#else
+	if (!folder || !PathFileExists(folder) ) return 0;
+#endif
+
+	STR_VEC vtsubfolders;
+	vtsubfolders.push_back(folder);	// 包含当前目录;
+	getsubfolder(folder, &vtsubfolders);
+
+	int n = vtsubfolders.size();
+	STR_VEC *pvtfiles = new STR_VEC[n];
+
+	for (STR_VEC::iterator it = vtsubfolders.begin(); it != vtsubfolders.end(); it++)
+	{
+		getfiles_findin_subfolder(it->c_str(), findext, &pvtfiles[--n]);
+	}
+
+	STR_VEC vtnames;
+	n = vtsubfolders.size();
+	TString name;
+	for (int i = 0; i < n; i++)
+	{
+		for (STR_VEC::iterator it = pvtfiles[i].begin(); it != pvtfiles[i].end(); it++)
+		{
+			name = getfilename(*it);
+			if (comparename_findin_names(name.c_str(), vtnames))
+			{
+				// 打印日志,提示客户重名的相片;
+				OutputDebugString(it->c_str());
+				OutputDebugString(_T("\n"));
+				pvtIsonym->push_back(it->c_str());
+			}
+			else
+			{
+				vtnames.push_back(name);
+			}
+		}
+	}
+
+	if (pvtfiles)
+		delete []pvtfiles;
+	pvtfiles = NULL;
+
+	return 0;
+}
+
+INT filehelper::comparefolder_findin_folder(IN LPCTSTR folder1, IN LPCTSTR folder2, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+	return 0;
+}
+
+INT filehelper::copyfolder(IN LPCTSTR from, IN LPCTSTR to)
+{
+	if (to == NULL || from == NULL)
+		return -1;
+
+	// 创建目录;
+	int nleft = 0;
+	int nIndex = -1;
+	TString strTo = to;
+	if (strTo.at(strTo.size()-1) != _T('\\'))
+		strTo.append(_T("\\"));
+	// 共享路径和硬盘盘符;
+	if (_tcscmp(strTo.substr(0, 2).c_str(), _T("\\\\")) == 0)
+		nleft = 2;
+	else if (strTo.at(2) == _T('\\'))
+		nleft = 3;
+
+	do 
+	{
+		nIndex = strTo.substr(nleft, -1).find_first_of(_T("\\"));
+		if (nIndex != TString::npos)
+		{
+			if (_tmkdir(strTo.substr(0, nIndex + nleft).c_str()) == -1 && errno != EEXIST)				
+				break;
+			nleft += nIndex + 1;
+		}		
+	} while (nIndex!=-1);
+	
+
+	return 0;
+}
+#endif
+
+

+ 273 - 12
SATHelper/filehelper/filehelper.h

@@ -35,27 +35,288 @@ public:
 	static void random(IN STR_VEC& vtContent, IN BOOL bSort = TRUE);
 	static void random(IN STR_VEC& vtContent, IN BOOL bSort = TRUE);
 	// 分隔数组;
 	// 分隔数组;
 	static void split(OUT vector<TString>& vtSplit, IN const TString str, IN const TString strSplit);
 	static void split(OUT vector<TString>& vtSplit, IN const TString str, IN const TString strSplit);
+	// 根据后缀名保留文件;
+	static void keepdownbyext(IN const TString &keepExt, IN STR_VEC &vtfiles);
+	static void keepdownbyext(IN const TString &keepExt, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult);
+	// 根据后缀名移除文件;
+	static void keepoutbyext(IN const TString &removeext, IN STR_VEC &vtfiles);
+	static void keepoutbyext(IN const TString &removeext, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult);
+	// 保留指定文件名(有后缀的:001.jpg)的文件路径;
+	void keepdowbyname(IN const STR_VEC &vtnames);
+	static void keepdowbyname(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles);
+	static void keepdowbyname(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result);
+	// 保留指定文件名(无后缀的:001)的文件路径;
+	void keepdowbyname_noext(IN const STR_VEC &vtnames);
+	static void keepdowbyname_noext(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles);
+	static void keepdowbyname_noext(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result);
+	// 分组扩展名;
+	static void subgroupExt(IN const TString &ext1, IN STR_VEC &vt1, IN const TString &ext2, IN STR_VEC &vt2);	
 
 
+	// 根据有后缀的文件名(如:001.jpg)来过虑文件;
+	static void filterbyname(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames);
+	void filterbyname(IN const STR_VEC &vtnames);
+
+	// 根据无后缀的文件名(如:001)来过虑文件;
+	static void filterbyname_noext(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames);
+	void filterbyname_noext(IN const STR_VEC &vtnames);
+
+	// 获取文件名,带后缀名(如:001.jpg);
+	inline void getnames(IN STR_VEC &vtfiles, IN STR_VEC &vtnames)
+	{
+		INT nIndex = 0;
+		for ( STR_VEC::iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
+		{
+			if ( (nIndex = it->find_last_of(_T('\\'))) != TString::npos )
+			{
+				vtnames.push_back(it->substr(nIndex+1));
+			}
+		}
+	}
+
+	// 获取文件名,不带后缀名(如:001);
+	inline void getnames_noext(IN const STR_VEC &vtfiles, IN STR_VEC &vtnames)
+	{
+		INT nIndex = 0;
+		INT nIndex2 = 0;
+		for ( STR_VEC::const_iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
+		{
+			if ( (nIndex = it->find_last_of(_T('\\'))) != TString::npos )
+			{
+				if ( (nIndex2 = it->find_last_of(_T('.'))) != TString::npos)
+				{
+					if ( nIndex2 > nIndex)
+						vtnames.push_back(it->substr(nIndex+1, nIndex2-nIndex));
+				}
+			}
+			else
+			{// vtfiles是没有目录的文件名,如:001.jpg;
+				if ( (nIndex2 = it->find_last_of(_T('.'))) != TString::npos)
+				{
+					vtnames.push_back(it->substr(0, nIndex2));
+				}
+			}
+		}
+	}
 public:
 public:
+	// 查找全部;
+	BOOL getall(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN OUT STR_VEC *pvtfiles,							// 返回要查找的文件全名;
+		IN OUT STR_VEC *pvtnames,							// 返回要查找的文件名(无路径,包含扩展名);
+		IN OUT STR_VEC *pvtfolders							// 返回要查找的子目录;
+		);
+
 	// 只获取当前要目录的子文件夹,不获取子文件夹中的文件夹;
 	// 只获取当前要目录的子文件夹,不获取子文件夹中的文件夹;
 	BOOL getsubfolder(
 	BOOL getsubfolder(
-		LPCTSTR lpfolder,								// 要查找的目录;
-		STR_VEC *pvtfolders								// 返回子文件夹;
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN STR_VEC *pvtfolders								// 返回子文件夹;
+		);
+
+	BOOL getallsubfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN STR_VEC *pvtfolders								// 返回所有子文件夹;
+		);
+
+	//////////////////////////////////////////////////////////////////////////
+	BOOL getfiles_findin_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtfiles								// 返回要查找的文件全名;
+		);
+
+	BOOL getfiles_findout_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN OUT STR_VEC *pvtfiles							// 返回要查找的文件全名;
+		);
+
+	BOOL getfiles_within_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtfiles,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtfolders								// 文件夹;
+		);
+
+	//////////////////////////////////////////////////////////////////////////
+	virtual BOOL getfiles_bynames_findin_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC &vtnames,
+		IN STR_VEC *pvtfiles								// 返回要查找的文件全名;
+		);
+
+	virtual BOOL getfiles_bynames_findout_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC &vtnames,
+		IN OUT STR_VEC *pvtfiles							// 返回要查找的文件全名;
+		) ;
+
+	virtual BOOL getfiles_bynames_within_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC &vtnames,
+		IN STR_VEC *pvtfiles,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtfolders								// 文件夹;
+		) ;
+
+	//////////////////////////////////////////////////////////////////////////
+	BOOL getnames_findin_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtnames								// 返回要查找的文件名(无路径,包含扩展名);
+		);
+
+	BOOL getnames_findout_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtnames								// 返回要查找的文件名(无路径,包含扩展名);
+		);
+
+	BOOL getnames_within_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtnames,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtfolders								// 文件夹;
+		);
+
+	//////////////////////////////////////////////////////////////////////////
+	BOOL getfilesnames_findin_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtfiles,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtnames								// 返回要查找的文件名(无路径,包含扩展名);
+		);
+
+	BOOL getfilesnames_findout_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtfiles,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtnames								// 返回要查找的文件名(无路径,包含扩展名);
+		);
+
+	BOOL getfilesnames_within_subfolder(
+		IN LPCTSTR lpfolder,								// 要查找的目录;
+		IN LPCTSTR lpfindext,								// 要查找的扩展名;
+		IN STR_VEC *pvtfiles,								// 返回要查找的文件全名;
+		IN STR_VEC *pvtnames,								// 返回要查找的文件名(无路径,包含扩展名);
+		IN STR_VEC *pvtfolders								// 文件夹;
+		);
+
+public:
+	//////////////////////////////////////////////////////////////////////////
+	BOOL comparename_findin_names(IN LPCTSTR name);
+
+	// 两个文件对比,是否同名;
+	BOOL comparename_2file(
+		IN LPCTSTR file1,									// 文件1(全路径);
+		IN LPCTSTR file2									// 文件2(全路径);
+		);
+
+	// 指定文件名,与一组文件名对比;
+	BOOL comparename_findin_names(
+		IN LPCTSTR name,									// 文件名(无路径,不含扩展名);
+		IN STR_VEC& vtnames									// 一组文件名(无路径,不含扩展名);
+		);
+
+	// 指定文件名,与一组文件对比;
+	BOOL comparename_findin_files(
+		IN LPCTSTR name,									// 文件名(不含扩展名);
+		IN STR_VEC& vtfiles									// 一组文件(全路径);
+		);
+
+	// 指定文件名,与一文件夹对比;
+	BOOL comparename_findin_folder(
+		IN LPCTSTR name,									// 文件名(不含扩展名);
+		IN LPCTSTR folder,									// 文件夹;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		IN BOOL bsubfolder									// 是否查找文件夹内的子目录;
+		);
+
+	//////////////////////////////////////////////////////////////////////////
+	// 指定一组文件名,与另一组文件名对比;
+	INT comparenames_findin_names(
+		IN STR_VEC vtSrcnames,								// 指定的一组源文件名(无路径,不含扩展名);
+		IN STR_VEC vtDesnames,								// 指定的一组目标文件名(无路径,不含扩展名);
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;	
+		);
+
+	// 指定一组文件名,与一组文件(全路径)对比;
+	INT comparenames_findin_files(
+		IN STR_VEC vtnames,									// 指定的一组源文件名(无路径,不含扩展名);
+		IN STR_VEC vtfiles,									// 指定的一组目标文件(全路径);
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
+		);
+
+	// 指定的一组文件名,与一文件夹对比;
+	INT comparenames_findin_folder(
+		IN STR_VEC vtnames,									// 指定的一组源文件名(无路径,不含扩展名);
+		IN LPCTSTR folder,									// 文件夹;
+		IN BOOL bsubfolder,									// 是否查找文件夹内的子目录;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
+		);
+
+	//////////////////////////////////////////////////////////////////////////
+	// 指定一文件,与一组文件名对比;
+	BOOL comparefile_findin_names(
+		IN LPCTSTR file,									// 文件1(全路径);
+		IN STR_VEC& vtnames									// 指定的一组文件名(无路径,不含扩展名)
+		);
+
+	// 指定一文件,与一组文件对比;
+	BOOL comparefile_findin_files(
+		IN LPCTSTR file,									// 文件(全路径);
+		IN STR_VEC& vtfiles,									// 指定的一组文件(全路径)
+		IN LPCTSTR findext									// 要查找的扩展名;
 		);
 		);
 
 
-	// 查找当前目录及子目录下的所有文件;
-	BOOL getallfiles(
-		LPCTSTR lpfolder,								// 要查找的目录;
-		LPCTSTR lpfindext,								// 要查找的扩展名;
-		STR_VEC *pvtfiles								// 返回要查找的文件全名;
+	// 指定一文件,与一文件夹对比;
+	BOOL comparefile_findin_folder(
+		IN LPCTSTR file,									// 文件(全路径);
+		IN LPCTSTR folder,									// 文件夹;
+		IN BOOL bsubfolder,									// 是否查找子文件夹;
+		IN LPCTSTR findext									// 要查找的扩展名;
 		);
 		);
 
 
-	// 只查找当前目录的文件,不查找子目录;
-	BOOL getfolderfiles(
-		LPCTSTR lpfolder,								// 要查找的目录;
-		LPCTSTR lpfindext,								// 要查找的扩展名;
-		STR_VEC *pvtfiles							// 返回要查找的文件全名;
+	//////////////////////////////////////////////////////////////////////////
+	// 指定一组文件,与另一组文件对比;
+	INT comparefiles_findin_files(
+		IN STR_VEC &vtfiles1,								// 指定的一组源文件;
+		IN STR_VEC &vtfiles2,								// 指定的一组目标文件;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
 		);
 		);
+
+	// 指定一组文件,与一文件夹对比;
+	INT comparefiles_findin_folder(
+		IN STR_VEC &vtfiles,								// 指定的一组源文件;
+		IN LPCTSTR folder,									// 指定的文件夹;
+		IN BOOL bsubfolder,									// 是否查找子文件夹;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
+		);
+
+	// 文件夹自我对比(所有子文件夹对比)
+	INT comparefolderself(
+		IN LPCTSTR folder,									// 指定文件夹;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
+		);
+
+	// 指定一文件夹,与另一文件夹对比;
+	INT comparefolder_findin_folder(
+		IN LPCTSTR folder1,									// 指定源文件夹;
+		IN LPCTSTR folder2,									// 指定目标文件夹;
+		IN BOOL bsubfolder,									// 是否查找子文件夹;
+		IN LPCTSTR findext,									// 要查找的扩展名;
+		OUT STR_VEC *pvtIsonym = NULL						// 返回同名的文件名;
+		);
+
+	public:
+		INT copyfolder(IN LPCTSTR from, IN LPCTSTR to);
 };
 };
 
 
 #endif
 #endif

+ 576 - 26
SATHelper/filehelper/findfile.cpp

@@ -1,4 +1,4 @@
-#include "stdafx.h"
+#include "StdAfx.h"
 #include "findfile.h"
 #include "findfile.h"
 #include <algorithm>
 #include <algorithm>
 
 
@@ -16,6 +16,114 @@ CONST TString	g_sVertical = _T("|");
 // 这个值最好可以从配置文件ini或xml中获取,不用在代码里写死;
 // 这个值最好可以从配置文件ini或xml中获取,不用在代码里写死;
 CONST TString	g_sCorrectExt = _T("*.jpg|*.jpeg|*.png|*.bmp|*.cr2|*.nef|*.raw");
 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):
 findfile::findfile(void):
 m_nlimit(nDefLimit),
 m_nlimit(nDefLimit),
@@ -25,13 +133,243 @@ m_pvtfolders(NULL),
 m_pvtfiles_sth(NULL),
 m_pvtfiles_sth(NULL),
 m_pvtfiles_mth(NULL)
 m_pvtfiles_mth(NULL)
 {
 {
-	
+	groupExt();
 }
 }
 
 
 findfile::~findfile(void)
 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
 函数:match
@@ -51,6 +389,8 @@ void findfile::setlimit(IN CONST INT &nLimit)
 		m_nlimit = nLimit;
 		m_nlimit = nLimit;
 }
 }
 
 
+
+
 // 获取文件名;
 // 获取文件名;
 TString findfile::getfilename(IN CONST TString &file)
 TString findfile::getfilename(IN CONST TString &file)
 {
 {
@@ -74,14 +414,15 @@ TString findfile::getfilename(IN CONST TString &file)
 	return name.substr(0, nIndex);
 	return name.substr(0, nIndex);
 }
 }
 
 
-void findfile::find1st(TString folder, TString &file)
+// 全部;
+void findfile::findall(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 		path.append(s_pathSeparator);
 		path.append(s_pathSeparator);
 
 
-	TString _file = _T("*");
-	TString s = path + _file;
+	TString file = _T("*");
+	TString s = path + file;
 
 
 	WIN32_FIND_DATA fileinfo = { 0 };
 	WIN32_FIND_DATA fileinfo = { 0 };
 	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
 	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
@@ -90,13 +431,54 @@ void findfile::find1st(TString folder, TString &file)
 	{
 	{
 		do
 		do
 		{
 		{
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
 			// '.'和 '..'的系统文件去除;
 			// '.'和 '..'的系统文件去除;
 			if (_T('.') != fileinfo.cFileName[0])
 			if (_T('.') != fileinfo.cFileName[0])
 			{
 			{
-				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				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)	// 目录;
 				{
 				{
-					file = path + fileinfo.cFileName;
-					break;
+					m_pvtfolders->push_back(path + fileinfo.cFileName);
 				}
 				}
 			}
 			}
 		} while (FindNextFile(handle, &fileinfo));
 		} while (FindNextFile(handle, &fileinfo));
@@ -105,8 +487,38 @@ void findfile::find1st(TString folder, TString &file)
 	}
 	}
 }
 }
 
 
-// 全部;
-void findfile::findall(IN CONST TString& folder)
+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;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -130,26 +542,59 @@ void findfile::findall(IN CONST TString& folder)
 			{
 			{
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
-					m_pvtfolders->push_back(path + fileinfo.cFileName);
-					findall(path + fileinfo.cFileName);
+					findfiles_findin_subfolder(path + fileinfo.cFileName);
 				}
 				}
 				else
 				else
 				{
 				{
 					if (!checklimit())
 					if (!checklimit())
 					{
 					{
-						m_pvtnames->push_back(fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 						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));
 		} while (FindNextFile(handle, &fileinfo));
 
 
 		FindClose(handle);
 		FindClose(handle);
 	}
 	}
 }
 }
 
 
-void findfile::findsubfolder(IN CONST TString& folder)	// 查找子目录;
+void findfile::findfiles_within_subfolder(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -165,11 +610,23 @@ void findfile::findsubfolder(IN CONST TString& folder)	// 
 	{
 	{
 		do
 		do
 		{
 		{
-			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
 			{
 			{
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
 					m_pvtfolders->push_back(path + fileinfo.cFileName);
 					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));
 		} while (FindNextFile(handle, &fileinfo));
@@ -178,7 +635,8 @@ void findfile::findsubfolder(IN CONST TString& folder)	// 
 	}
 	}
 }
 }
 
 
-void findfile::findallsubfolder(IN CONST TString& folder)
+//////////////////////////////////////////////////////////////////////////
+void findfile::findnames_findin_subfolder(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -194,12 +652,99 @@ void findfile::findallsubfolder(IN CONST TString& folder)
 	{
 	{
 		do
 		do
 		{
 		{
-			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
+			// 检查是否超过最大数;
+			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)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
 					m_pvtfolders->push_back(path + fileinfo.cFileName);
 					m_pvtfolders->push_back(path + fileinfo.cFileName);
-					findallsubfolder(path + fileinfo.cFileName); // 不入子目录查找;
+					findnames_within_subfolder(path + fileinfo.cFileName);
+				}
+				else
+				{
+					if (!checklimit())
+					{
+						m_pvtnames->push_back(fileinfo.cFileName);
+					}
 				}
 				}
 			}
 			}
 		} while (FindNextFile(handle, &fileinfo));
 		} while (FindNextFile(handle, &fileinfo));
@@ -209,7 +754,7 @@ void findfile::findallsubfolder(IN CONST TString& folder)
 }
 }
 
 
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-void findfile::findfiles_findin_subfolder(IN CONST TString& folder)
+void findfile::findfilesnames_findin_subfolder(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -233,12 +778,13 @@ void findfile::findfiles_findin_subfolder(IN CONST TString& folder)
 			{
 			{
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
-					findfiles_findin_subfolder(path + fileinfo.cFileName);
+					findfilesnames_findin_subfolder(path + fileinfo.cFileName);
 				}
 				}
 				else
 				else
 				{
 				{
-					if (!checklimit())
+					if (!checklimit() )
 					{
 					{
+						m_pvtnames->push_back(fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 					}
 					}
 				}
 				}
@@ -249,7 +795,7 @@ void findfile::findfiles_findin_subfolder(IN CONST TString& folder)
 	}
 	}
 }
 }
 
 
-void findfile::findfiles_findout_subfolder(IN CONST TString& folder)
+void findfile::findfilesnames_findout_subfolder(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -273,19 +819,21 @@ void findfile::findfiles_findout_subfolder(IN CONST TString& folder)
 			{
 			{
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
-					if (!checklimit())
+					if (!checklimit() )
 					{
 					{
+						m_pvtnames->push_back(fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 					}
 					}
 				}
 				}
 			}
 			}
+
 		} while (FindNextFile(handle, &fileinfo));
 		} while (FindNextFile(handle, &fileinfo));
 
 
 		FindClose(handle);
 		FindClose(handle);
 	}
 	}
 }
 }
 
 
-void findfile::findfiles_within_subfolder(IN CONST TString& folder)
+void findfile::findfilesnames_within_subfolder(IN CONST TString& folder)
 {
 {
 	TString path = folder;
 	TString path = folder;
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
 	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
@@ -310,16 +858,18 @@ void findfile::findfiles_within_subfolder(IN CONST TString& folder)
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
 				{
 				{
 					m_pvtfolders->push_back(path + fileinfo.cFileName);
 					m_pvtfolders->push_back(path + fileinfo.cFileName);
-					findfiles_within_subfolder(path + fileinfo.cFileName);
+					findfilesnames_within_subfolder(path + fileinfo.cFileName);
 				}
 				}
 				else
 				else
 				{
 				{
-					if (!checklimit())
+					if (!checklimit() )
 					{
 					{
+						m_pvtnames->push_back(fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 						m_pvtfiles->push_back(path + fileinfo.cFileName);
 					}
 					}
 				}
 				}
 			}
 			}
+
 		} while (FindNextFile(handle, &fileinfo));
 		} while (FindNextFile(handle, &fileinfo));
 
 
 		FindClose(handle);
 		FindClose(handle);

+ 25 - 1
SATHelper/filehelper/findfile.h

@@ -49,6 +49,13 @@ public:
 	STR_VEC *m_pvtfiles_sth;	// s小图;
 	STR_VEC *m_pvtfiles_sth;	// s小图;
 	STR_VEC *m_pvtfiles_mth;	// m小图;	
 	STR_VEC *m_pvtfiles_mth;	// m小图;	
 public:
 public:
+	static BOOL iscorrectext(IN const TString &fext, OUT TString* lpMistakenExt = NULL);
+	// lowercase和uppercase在多字节下生僻字会出问题(珺、琤,珺转小写会变成琤,反过来琤转大写会变成珺);已修改;
+	static TString lowercase(IN const TString &Str);
+	static void lowercase(IN TString& str);
+	static TString uppercase(IN const TString &Str);
+	static void uppercase(IN TString& str);
+	//static int match(IN CONST TString &sExt, IN CONST TString &sFile);
 	static inline int findfile::match(IN CONST TString &strExt, IN CONST TString &strfile)
 	static inline int findfile::match(IN CONST TString &strExt, IN CONST TString &strfile)
 	{
 	{
 		int pos = strfile.find_last_of(_T('.'));
 		int pos = strfile.find_last_of(_T('.'));
@@ -63,11 +70,14 @@ protected:
 	INT  getlimit() const { return m_nlimit; }
 	INT  getlimit() const { return m_nlimit; }
 	void setlimit(IN CONST INT &nlimit);
 	void setlimit(IN CONST INT &nlimit);
 
 
+	void groupExt();
+	void groupExt( IN CONST TString &exts, IN STR_VEC &vtExts );
+
 	inline INT checklimit() { return m_pvtfiles->size() == getlimit(); }
 	inline INT checklimit() { return m_pvtfiles->size() == getlimit(); }
+
 	BOOL IsaDirectory(CONST TString &sDirectory) { return (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(sDirectory.c_str())); }
 	BOOL IsaDirectory(CONST TString &sDirectory) { return (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(sDirectory.c_str())); }
 
 
 public:
 public:
-	void find1st(TString folder, TString &file);
 	// 查找所有文件,包括子文件夹名、文件名、文件路径;
 	// 查找所有文件,包括子文件夹名、文件名、文件路径;
 	void findall(IN CONST TString& folder);
 	void findall(IN CONST TString& folder);
 	// 只返回2级子目录名(测试ok);
 	// 只返回2级子目录名(测试ok);
@@ -81,6 +91,20 @@ public:
 	void findfiles_findout_subfolder(IN CONST TString& folder);
 	void findfiles_findout_subfolder(IN CONST TString& folder);
 	// 查找文件路径,以及查找子目录的文件路径,同时获取子目录名(测试ok);
 	// 查找文件路径,以及查找子目录的文件路径,同时获取子目录名(测试ok);
 	void findfiles_within_subfolder(IN CONST TString& folder);
 	void findfiles_within_subfolder(IN CONST TString& folder);
+
+	// 查找文件名称,以及查找子目录的文件名称,但不获取子目录名(返回的文件包含扩展名)(测试ok);
+	void findnames_findin_subfolder(IN CONST TString& folder);
+	// 查找文件名称,不查找子目录的文件(返回的文件包含扩展名)(测试ok);
+	void findnames_findout_subfolder(IN CONST TString& folder);
+	// 查找文件名称,以及查找子目录的文件名称,同时获取子目录名(返回的文件包含扩展名)(测试ok);
+	void findnames_within_subfolder(IN CONST TString& folder);
+
+	// 查找文件路径和文件名,以及查找子目录的文件路径和文件名,但不获取子目录名;(返回的文件包含扩展名)(测试ok);
+	void findfilesnames_findin_subfolder(IN CONST TString& folder);
+	// 查找文件路径和文件名,不查找子目录;(返回的文件包含扩展名)(测试ok);
+	void findfilesnames_findout_subfolder(IN CONST TString& folder);
+	// 查找文件路径和文件名,以及查找子目录的文件路径和文件名,且获取子目录名;(返回的文件包含扩展名)(测试ok);
+	void findfilesnames_within_subfolder(IN CONST TString& folder);
 };
 };
 
 
 #endif
 #endif

Some files were not shown because too many files changed in this diff