最近需要批量处理命名带有规则的文件,用一个按钮控件(选择文件夹)选择需要处理的文件夹,将其显示在文本框内,然后在设置一个开始处理的按钮(批量测试),读取文件夹路径,按照文件的命名规则删选出文件进行批量处理。
MFC界面如下:
控件代码实现如下:
控件–选择文件夹的事件处理消息:
void CTestToolDlg::OnBnClickedFileButton()
{
// TODO: Add your control notification handler code here
CFileFind finder;
CString path;
BOOL fileExist;
// 获取特定文件夹的LPITEMIDLIST,可以将之理解为HANDLE
// 所谓的特定文件夹,你可以用CSIDL_XXX来检索之。
LPITEMIDLIST rootLoation;
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &rootLoation);
if (rootLoation == NULL) {
// unkown error
return;
}
// 配置对话框
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.pidlRoot = rootLoation; // 文件夹对话框之根目录,不指定的话则为我的电脑
bi.lpszTitle = _T("对话框抬头"); // 可以不指定
// bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
// 打开对话框, 有点像DoModal
LPITEMIDLIST targetLocation = SHBrowseForFolder(&bi);
if (targetLocation != NULL) {
TCHAR targetPath[MAX_PATH];
SHGetPathFromIDList(targetLocation, targetPath);
GetDlgItem(IDC_FILE_EDIT)->SetWindowText(targetPath);//将路径显示
}
}
控件–批量测试的事件实现代码:
void CTestToolDlg::OnBnClickedFileTestButton()
{
// TODO: Add your control notification handler code here
char PATH[100];
CEdit* pwdbox2 = (CEdit*)GetDlgItem(IDC_FILE_EDIT);
pwdbox2->GetWindowText(PATH, 100);
CFileFind finder;
CString filepathname;
CString str_file;
str_file.Format("%s", PATH);
BOOL YesNo = finder.FindFile(str_file + _T("\\*-corner1.jpg"));
while (YesNo)
{
YesNo = finder.FindNextFile();
filepathname = finder.GetFilePath();
std::string STDStr(filepathname.GetBuffer(0));
int i = STDStr.find("corner");
std::string filename = STDStr.substr(0, i);
cout << filename << endl;
std::string filename2 = filename + "corner2.jpg";
BOOL rec = PathFileExists(filename2.c_str());
cout << rec << endl;
if (rec == true) {
process(PIC1_NAME, PIC2_NAME);
}
}
}
图片的命名规则是:
设备名称+生成时间+corner1.jpg
设备名称+生成时间+corner2.jpg
corner1和corner2是同个设备同一时间两个镜头抓拍的结果
prcess内的是我的处理代码,是找到同个设备同一时间对应的corner1和corner2 图片然后进行处理