C++编写批量修改带括号的重名图片

// rename.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <errno.h>
#include <windows.h>
#include <stdint.h>
#include <atlstr.h>
#include <io.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void reNameAllFiles(string filepath, string typefile)
{
	//根据机器位数定义,在64位机器上,intptr_t为long int,uintptr_t为unsigned long int。
	//而在非64位机器上,intptr_t为int,uintptr_t为unsigned int。
	//保存句柄
	intptr_t hFile = 0;
	//存储文件信息的结构体,具体可自行搜索
	struct _finddata_t fileinfo;
	string p;
	//str1.assgin(str2)将str2赋值给str1;str1.append(str2)在str1末尾添加str2;string.c_str()转换成const char*类型
	//_findfirst( char *filespec, struct _finddata_t *fileinfo )查找文件,成功则返回句柄,失败返回-1
	//所以下一行就是查找第一个“运行目录/*.jpg”的文件,找到就做下一步
	if ((hFile = _findfirst(p.assign(filepath).append("\\*" + typefile).c_str(), &fileinfo)) != -1) {
		do {
			//根据结构体的定义直接获取存储在里面的文件名
			string f = fileinfo.name;
			//判断是不是含有(n)的文件,不是则不做操作继续循环找下一个“运行目录/*.jpg”文件,否则重命名
			if (f.find('(') == string::npos)
				continue;
			else {
				//根据需求截取字符串,具体可看string类的用法
				string s(f, 0, f.find('(')-1);
				//这里f.c_str()是为了获取string的首地址
				string number(f.c_str() + f.find('(') + 1, f.c_str() + f.find(')'));
				/* rename函数定义 int rename(const char* oldpath, const char* newpath) 
				会将参数oldpath 所指定的文件名称改为参数newpath所指的文件名称。若newpath所指定的文件已存在,则会被删除。
				有返回值,成功为0,失败为-1;若失败且原因为文件已存在则再将前缀加上1314*/
				if (rename((filepath + f).c_str(), (filepath + number + s + typefile).c_str()) == -1 && errno == 17)
					rename((filepath + f).c_str(), (filepath + number + "1314" + s + typefile).c_str());
			}
		} while (_findnext(hFile, &fileinfo) == 0);//调用_findnext函数查找其他的文件,成功返回0失败返回-1,当查找完毕后用,用_findclose函数结束查找。
		_findclose(hFile);
	}
}

int main() {
	CString strExePath;//一个功能强大、特殊的string类,CString字符串类是属于MFC(微软基础类库)比较常用的一个类
	//MAX_PATH为宏常量,在VC++为260,一般用于处理文件和路径时
	char buff[MAX_PATH];//用来存放exe路径
	//获取exe运行的绝对路径,第一个参数为句柄,NULL则指向当前程序。第二个参数用于存放地址数组的指针,第三个参数size直接用宏常量就好。
	GetModuleFileName(NULL, buff, MAX_PATH);
	//转换成CString以便后续使用CString类的函数
	CString strPath = buff;
	//查找倒数最后一个“\\”符号,返回索引
	int nPos = strPath.ReverseFind('\\');
	//只取exe所在目录路径,该函数与string截取函数操作类似
	strExePath = strPath.Left(nPos + 1);
	reNameAllFiles(strExePath.GetBuffer(), ".jpg");
	cout << "结束了。。。" << endl;
	getchar();//避免运行完直接关闭,方便查看结果
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值