前几天想起了整理电脑里的相册(当然网盘也有完整的备份),分类整理的时候发现好多图片名称重复,复制过去就会被覆盖,我也不知道啥回事,照理说不同的手机不同的时间拍摄的图片命名应该是不一样的.但是现在问题就是出现了,本来在网上下个软件是最优的解决方案,不过想了想还是自己弄个.
首先就是要能读取文件夹里的文件名,这里借鉴了https://blog.csdn.net/Dr_Myst/article/details/81463450这篇文章
BOOL CWENJIANPILIANGGAIMINGDlg::xlk_init()
{
/*设置下拉框*/
xlk_GZ.InsertString(0, _T("在最前面添加"));
xlk_GZ.InsertString(1, _T("在最前面添加 \"_1\"数字排序,可指定开始数字"));
xlk_GZ.InsertString(2, _T("在最后面添加"));
xlk_GZ.InsertString(3, _T("在最后面添加 \"_1\"数字排序,可指定开始数字"));
xlk_GZ.InsertString(4, _T("某段字符替换"));
xlk_GZ.InsertString(5, _T("某段字符替换并在最后面添加 \"_1\"数字排序,可指定开始数字"));
xlk_GZ.InsertString(6, _T("删除指定字符"));
xlk_GZ.InsertString(7, _T("删除指定字符并在最后面添加 \"_1\"数字排序,可指定开始数字"));
xlk_GZ.InsertString(8, _T("全部重命名并数字排序 \"_1\"开始"));
xlk_GZ.SetCurSel(0); //初始显示第几项的内容
dang_qian_lie = 0;
xlk_KZ.InsertString(0, _T(".jpg"));
xlk_KZ.InsertString(1, _T(".gif"));
xlk_KZ.InsertString(2, _T(".txt"));
xlk_KZ.InsertString(3, _T(".pdf"));
xlk_KZ.InsertString(4, _T(".mp4"));
xlk_KZ.InsertString(5, _T("自定义"));
xlk_KZ.SetCurSel(0);
dang_qian_kuo_zhan = 0;
xlk_KZ.GetLBText(dang_qian_kuo_zhan, kuo_zhan_ming_L);
bjk_yin_chang_P = (CEdit*)GetDlgItem(IDC_EDIT2);//编辑框_原始字符指针
bjk_yin_chang_xu_hao_P = (CEdit*)GetDlgItem(IDC_EDIT4);//编辑框_规则修改名(序号)指针
bjk_kuo_zhan_zi_ding_yi_P= (CEdit*)GetDlgItem(IDC_EDIT5);//编辑框_扩展自定义指针
wbk_ti_huan_P = (CEdit*)GetDlgItem(IDC_STATIC_02);//文本控件"替换"
wbk_xu_hao_P = (CEdit*)GetDlgItem(IDC_STATIC_01);//文本控件"序号"
bjk_yin_chang_P->ShowWindow(FALSE);//隐藏控件
bjk_yin_chang_xu_hao_P->ShowWindow(FALSE);//隐藏控件
wbk_ti_huan_P->ShowWindow(FALSE);//隐藏控件
wbk_xu_hao_P->ShowWindow(FALSE); //隐藏控件
bjk_kuo_zhan_zi_ding_yi_P->ShowWindow(FALSE); //隐藏控件
/*在控件显示了的情况下*/
// bjk_yin_chang_P->EnableWindow(FALSE);//控件不可用,颜色变灰色
// bjk_yin_chang_P->EnableWindow(TRUE); //控件可用,颜色正常
return 0;
}
新建一个线程来给文件改名,在新线程里使用switch分支判断用的哪种修改规则
UINT _cdecl ti_huan(LPVOID lpParam)
{
CWENJIANPILIANGGAIMINGDlg* gai_ming_LP = (CWENJIANPILIANGGAIMINGDlg*)lpParam;
TiHuan ti_huan_LP; //修改文件名的类
//gai_ming_LP->dang_qian_lie;
CString path;
int len = 0;
switch (gai_ming_LP->dang_qian_lie)
{
case 0:
len = ti_huan_LP.zui_qian_h(gai_ming_LP->path_L, gai_ming_LP->bjk_GM,gai_ming_LP->kuo_zhan_ming_L);
函数:在文件名最前面添加字符
int TiHuan::zui_qian_h(CString path, CString xiu_gai, CString kuo_zhan)
{
/*PathFindExtension*/
/*rename(oldName.c_str(), newName.c_str()) 修改文件名*/
int len = 0;
CString kuo_zhan_ming_j;
CString wen_jian_ming_j;
if (path==L"")
{
return -3;
}
wen_jian_ming_j = path + L"\\*";
USES_CONVERSION;
const char* path_jp = T2A(wen_jian_ming_j);
long long handle; /*用于查找的句柄*/
struct _finddata_t fileinfo; /*文件信息的结构体*/
/*_findfirst
参数1: 支持通配符,*.c表示当前路径下所有的后缀为.c的文件
参数2: 这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明
*/
handle = _findfirst(path_jp, &fileinfo);//获取句柄
if (-1 == handle)
{
return -1;
}
if (fileinfo.attrib != _A_SUBDIR)
{
wen_jian_ming_j = CString(fileinfo.name);
kuo_zhan_ming_j.Format(L"%s", PathFindExtension(wen_jian_ming_j)); /*获取文件扩展名*/
kuo_zhan_ming_j = kuo_zhan_ming_j.MakeLower(); /*将扩展名转换为小写字母*/
if (kuo_zhan_ming_j.CollateNoCase(kuo_zhan) == 0) /*比较字符串,不区分大小写*/
{
len++;
}
}
CString xiu_gai_j;
while (!_findnext(handle,&fileinfo))//循环查找其他符合的文件,知道找不到其他的为止
{
if (fileinfo.attrib != _A_SUBDIR)
{
wen_jian_ming_j = CString(fileinfo.name);
kuo_zhan_ming_j.Format(L"%s", PathFindExtension(wen_jian_ming_j)); /*获取文件扩展名*/
if(kuo_zhan_ming_j.CollateNoCase(kuo_zhan)==0) /*比较字符串,不区分大小写*/
{
xiu_gai_j = L"abc";
xiu_gai_j = path + L"\\" + xiu_gai_j + wen_jian_ming_j;
wen_jian_ming_j = path + L"\\" + wen_jian_ming_j;
/*移动目录或者文件,修改目录或者文件名
* 参数1: 要修改目录或文件的路径与名字
* 参数2: 文件或目录的新名称。新名称不得已存在
* 返回值: 失败返回0
*/
if (!MoveFile(wen_jian_ming_j, xiu_gai_j))
{
_findclose(handle); /*关闭句柄*/
return -2;
}
len++;
}
}
}
_findclose(handle); /*关闭句柄*/
return len;
}
修改文件任意位置字符,修改后稍座处理后在用MoveFile函数修改
BOOL TiHuan::xiu_gai_zhong_jian_h(CString& wen_jian_ming, CString yuan_zi_fu, CString xiu_gai_zi_fu)
{
int aa = wen_jian_ming.GetLength();/*计算字符串长度,中文也为1,实际上中文是2*/
//int abc = a.ReverseFind(_T('.'));/*从右往左开始查找 '.'*/
/*查找
* 要查找的内容""或要搜索的单个字符''
* 开始搜索的字符串中字符的索引,或从头开始搜索的 0
* 返回:失败返回-1,成功返回匹配的第一个字符的从零开始的索引
*/
int aad = wen_jian_ming.Find(yuan_zi_fu);
if (-1==aad)
{
return FALSE;
}
int aae = yuan_zi_fu.GetLength();
/*从给定索引处的字符开始的字符串中删除一个或多个字符
* 参数1: 要删除 的对象中第一个字符的从零开始的索引。
* 参数2: 要删除的字符数
*/
int aag = wen_jian_ming.Delete(aad, aae);
if (aag <= 0)
{
return FALSE;
}
/*在字符串的给定索引处插入单个字符或子字符串
* 参数1: 将在其之前进行插入的字符的索引
* 参数2:指向要插入的子字符串的指针
*/
int aaf = wen_jian_ming.Insert(aad, xiu_gai_zi_fu);
if (aaf <= 0)
{
return FALSE;
}
return TRUE;
}
下拉框控件事件处理
void CWENJIANPILIANGGAIMINGDlg::OnCbnSelchangeCombo1()
{
UpdateData(TRUE);//用于将屏幕上控件中的数据交换到变量中。
dang_qian_lie = xlk_GZ.GetCurSel(); //获取当前项的序号
wbk_ti_huan_P->ShowWindow(FALSE);//隐藏控件
bjk_yin_chang_P->ShowWindow(FALSE);//隐藏控件
bjk_yin_chang_xu_hao_P->ShowWindow(FALSE);//隐藏控件
wbk_xu_hao_P->ShowWindow(FALSE);//隐藏控件
if (dang_qian_lie == 5)
{
bjk_yin_chang_xu_hao_P->ShowWindow(TRUE);//显示控件
bjk_yin_chang_P->ShowWindow(TRUE);//显示控件
wbk_xu_hao_P->ShowWindow(TRUE);//显示控件
wbk_ti_huan_P->ShowWindow(TRUE);//显示控件
UpdateData(FALSE);//用于将数据在屏幕中对应控件中显示出来。
}
if (dang_qian_lie == 1 || dang_qian_lie == 3 || dang_qian_lie == 7)
{
bjk_yin_chang_xu_hao_P->ShowWindow(TRUE);//显示控件
wbk_xu_hao_P->ShowWindow(TRUE);//显示控件
UpdateData(FALSE);//用于将数据在屏幕中对应控件中显示出来。
}
//xlk_GZ.SetCurSel(dang_qian_lie);
//UpdateData(FALSE);
}
先解决有无,在说其他,经过十分不严谨的测试,现在能将就用着了.实际上对我要做的事来说,已经够用了,准备把子文件夹的功能弄好就完工.GOGO…