C++之文件批量改名

   前几天想起了整理电脑里的相册(当然网盘也有完整的备份),分类整理的时候发现好多图片名称重复,复制过去就会被覆盖,我也不知道啥回事,照理说不同的手机不同的时间拍摄的图片命名应该是不一样的.但是现在问题就是出现了,本来在网上下个软件是最优的解决方案,不过想了想还是自己弄个.

   首先就是要能读取文件夹里的文件名,这里借鉴了https://blog.csdn.net/Dr_Myst/article/details/81463450这篇文章

先建立一个简单的界面
C++之文件批量改名_第1张图片
然后初始化2个下拉框

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…

你可能感兴趣的:(C/C++笔记,c++,开发语言)