MFC 批量查找替换文件内容

批量文件内容替换工具
本文介绍了一款使用MFC开发的小程序,能够批量查找并替换指定目录下所有目标文件中的字符串,适用于卫星网络仿真等场景。

今天工作的时候遇到一个问题,需要将一系列文件中的某个字符串替换成另一字符串,手动替换太麻烦了,于是就想写个小程序来完成这一任务。

(具体工作是:我在做卫星网络的仿真,要将STK生成的轨道文件(200多个)导入到OPNET中,但要将每个轨道文件中的"EphemerisTimePosVel"替换为“EphemerisEcfTimePosVel”)

我用MFC做了一个简单的界面:


程序的实现涉及到以下几方面:

1.  某个目录下文件的查找;

2.  文件内容的读取、替换与写入;

3. “选择文件夹”对话框的实现。

下面分别介绍。


1. 某个目录下文件的查找

文件的查找使用CFileFind类,实现代码如下:

void CmodifyFilesDlg::OnBnClickedButtonFind()
{
	CString strCurrDir;							// 选择的文件夹路径
	CString findStr;							// 要查找的字符串
	CString replaceStr;							// 要替换的字符串
	CString extStr;								// 要修改的文件的后缀名

	m_dirStr.GetWindowText(strCurrDir);		
	m_strFind.GetWindowText(findStr);
	m_strReplace.GetWindowText(replaceStr);
	m_fileExt.GetWindowTextW(extStr);
	m_fileList.ResetContent();

	CFileFind   finder;
	BOOL bWorking = finder.FindFile(strCurrDir + _T("\\*.")+extStr);	// 查找该路径下指定后缀的文件,若找到,返回值为true
	while (bWorking)
	{
		bWorking = finder.FindNextFile();								// 继续查找下一个,若找到,返回值为true
		CString tempFileName = finder.GetFilePath();					// 获得上一个查找到的文件的完整路径
		if (finder.IsDots()) continue;
		if (finder.IsDirectory()) continue;

		else
		{
			m_fileList.AddString(tempFileName);


2. 文件内容的读取、替换与写入

文件内容的读取和写入使用CFile类。

使用CFile的Read函数将文件内容读取到char数组中:

			CFile file(tempFileName, CFile::modeReadWrite);				// 以读写模式打开

			DWORD len = file.GetLength();
			char *buf = new char[len + 1];
			buf[len] = 0;  
			file.Read(buf, len);

为了使用CString的查找替换功能,要进行char*和CString之间的转换。首先是从char*到CString,可以直接利用CString的构造函数:

			CString fileContent(buf);

然后利用CString的Replace函数进行字符串的替换,这里一次调用实现全部替换:

			fileContent.Replace(findStr, replaceStr);

接着要进行文件的写入。起初,我天真地调用了下面这句:

			//file.Write(fileContent, fileContent.GetLength());

但是,输出得到的文件内容要么不完整,要么乱码。找了些资料,发现问题在于:CString使用的是Unicode字符,但CFile的Write函数是以字节形式写入的,所以,在写入前要进行CString到char*的转换,这里用到了WideCharToMultiByte函数:

			int nLength = fileContent.GetLength();
			int nBytes = WideCharToMultiByte(CP_ACP, 0, fileContent, nLength, NULL, 0, NULL, NULL);	// 得到需要的字节数
			char* newbuf = new char[nBytes + 1];
			WideCharToMultiByte(CP_OEMCP, 0, fileContent, nLength, newbuf, nBytes, NULL, NULL);		// 字符的转换
			newbuf[nBytes] = 0;

接下来,就进行文件的写入。这里,要实现文件内容的覆盖,就是说,先要将原文件的内容清空,这里使用SetLength函数:

			file.SeekToBegin();									// 指向文件开头
			file.SetLength(0);									// 清空文件内容
			file.Write(newbuf, nBytes);	
			//file.Write(fileContent, fileContent.GetLength());

			delete(newbuf);
			delete(buf);
			file.Close();
		}
	}
	MessageBox(_T("替换完毕"));
	finder.Close();
}

3. “选择文件夹”对话框的实现

使用CFolderPickerDialog类:

void CmodifyFilesDlg::OnBnClickedButtonOpen()
{
	CFolderPickerDialog dlg;
	if (dlg.DoModal() == IDOK)
	{
		m_dirStr.SetWindowText(dlg.GetFolderPath());    // 获得路径  
	}
}

程序实现了,可以方便地批量查找替换文件内容了!





小软件Replace Plus:为多个文本文件内容批量替换 当我们的文本里有些相同的文本内容替换成其他内容时,可以运用到“文本替换”功能,这一功能在诸多的文本编辑软件里都有,并不算稀奇。但是,如果你有多个文件,想要同时替换它们里面的一些相同内容,显然不是其简单的替换功能就能够达到的。要想批处理完成N个文件的文本同时替换,我给大家推荐一个小工具——Replace Plus。它是一款绿色小软件,并不需要安装,直接双击打开即可使用。   在列表栏里点击右键,选择“添加文件”即可将单独的文件添加进列表,如果您想要更加省事一些,就将欲替换文本的文件放置于一个文件夹下。右键点击选择“添加目录”,将那个文件夹添加进来,该目录下的所有文件就直接添加进来了,省去了一个一个添加的麻烦。   在“查找”栏内输入欲查找内容,在“替换”栏里输入欲替换内容,点击“执行替换”,默认情况下会跳出“替换”对话框询问是否要替换,如果要一劳永逸地不必每个文件都跳出对话框来询问,可直接点击“替换全部”。   当列表里的“备注”栏显示出“替换成功”,即表示已经将不同文件里的相同内容替换完成。并且在列表里还会显示替换成功的数量,一目了然(如图),很简便也很实用吧!要删除列表里的内容,直接选定欲删除的内容后,在右键菜单里点击“删除”即可。  
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值