当前位置:C++技术网 > 资讯 > 文件重命名小程序

文件重命名小程序

更新时间:2015-12-24 17:46:52浏览次数:1+次

新建对话框功能,创建如图的对话框:

为两个按钮建立消息响应,为两个编辑框和进度条控件绑定控件变量:

CProgressCtrl	m_Progress;
CEdit	m_Prefix;
CEdit	m_FileDir;
 消息响应:
void CFileRenameDlg::OnBtBrowse() 
{
	TCHAR szPath[1000];
	CString str;
	ZeroMemory(szPath,sizeof(szPath));
	BROWSEINFO bi;
	bi.hwndOwner=this->GetSafeHwnd();
	bi.pidlRoot=NULL;
	bi.pszDisplayName=szPath;
	bi.lpszTitle="请选择文件夹:";
	bi.ulFlags=BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
	bi.lpfn=BrowseCallBackProc;
	bi.lParam=(LPARAM)_TEXT("桌面:\\");
	bi.iImage=0;
	LPITEMIDLIST lp=SHBrowseForFolder(&bi);
	if(lp && SHGetPathFromIDList(lp, szPath))   
    {
        str.Format("选择的目录为 %s", szPath);
        //AfxMessageBox(str);
	}
    else   
	{
		AfxMessageBox("无效的目录,请重新选择");
		return ;
	}
	m_FileDir.SetWindowText(szPath);
}

int CALLBACK BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 
{  
      switch(uMsg)  
      {  
      case BFFM_INITIALIZED:  //选择文件夹对话框初始化  
 //设置默认路径为lpData即'D:\'  
          ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);  
          //在STATUSTEXT区域显示当前路径  
         ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);  
         //设置选择文件夹对话框的标题  
         ::SetWindowText(hwnd, TEXT("测试"));   
         break;  
     case BFFM_SELCHANGED:   //选择文件夹变更时  
         {  
             TCHAR pszPath[MAX_PATH];  
             //获取当前选择路径  
             SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);  
             //在STATUSTEXT区域显示当前路径  
             ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);  
         }  
         break;  
     }  
     return 0;  
}  


//开始批量重命名文件
void CFileRenameDlg::OnBtStart() 
{
	CFileFind flFind;
	CString szDir;
	m_FileDir.GetWindowText(szDir);

	BOOL IsFind2=flFind.FindFile(szDir + "\\*.*");
	//统计位图数量
	int nBmpCount = 0;
	CFileFind flFindCount;
	BOOL IsFind=flFindCount.FindFile(szDir + "\\*.*");
	while (IsFind)
	{
		IsFind=flFindCount.FindNextFileA();
		if (!flFindCount.IsDirectory())
		{
			CString szPath;
			szPath = flFindCount.GetFilePath();
			//MessageBox(szPath);
			char szLetter[128] = {0};	//盘符
			char szCurDir[128] = {0};	//目录
			char szName[128] = {0};		//文件名
			char szExt[128] = {0};		//扩展名
			_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt);	//分解目录
			//判断文件扩展名
			if (strcmp(szExt, ".bmp") == 0)
			{
				nBmpCount++;
			}
		}
	}
	flFindCount.Close();
	m_Progress.SetRange32(0, nBmpCount);

	//遍历位图文件
	szDir = szDir + "\\bmp";
	CreateDirectory(szDir, NULL);				//创建目录
	int nIndex = 1;
	while(IsFind2)
	{
		IsFind2=flFind.FindNextFileA();
		if (!flFind.IsDirectory())
		{
			
			CString szPath;
			szPath = flFind.GetFilePath();
			char szLetter[128] = {0};	//盘符
			char szCurDir[128] = {0};	//目录
			char szName[128] = {0};		//文件名
			char szExt[128] = {0};		//扩展名
			_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt);	//分解目录
			//获取前缀
			CString szPrefix;
			m_Prefix.GetWindowText(szPrefix);
			//判断文件扩展名
			if (strcmp(szExt, ".bmp") == 0)
			{
				CFile file;
				CString szCreatedName = szDir;
				szCreatedName += "\\";
				szCreatedName += szPrefix;	//添加前缀
				CString szIndex;
				szIndex.Format("%d", nIndex);
				szCreatedName += szIndex;	//添加序号
				szCreatedName += ".bmp";
				m_Progress.SetPos(nIndex);
				nIndex++;
				//创建新的文件
				file.Open(szCreatedName, CFile::modeCreate|CFile::modeReadWrite);
				
				CFile readFile;
				readFile.Open(szPath, CFile::modeRead);
				DWORD dwLen = readFile.GetLength();
				BYTE *pData = new BYTE[dwLen];
				readFile.Read((void*)pData, dwLen);
				readFile.Close();
				file.Write((void*)pData, dwLen);
				file.Close();
				
				delete [] pData;
				szCreatedName.ReleaseBuffer();
				szIndex.ReleaseBuffer();
			}
		}
	}
	flFind.Close();

	CString szBmpCount;
	szBmpCount.Format("%d个文件!", nBmpCount);
	MessageBox("操作完成,处理" + szBmpCount);
	szBmpCount.ReleaseBuffer();
}
创建文件夹对话框的代码,请看《文件夹对话框的创建》,关于CFindFile的代码请看《CFindFile类的一个误区》。运行结果:

原本我打开的是新建文件夹,里面只有四张图片,三张是bmp的。代码运行成功后,打开重命名的bmp文件。可以看到重命名的图片。说明一下,对于中文命名的图片,会直接用重命名的前缀代替。英文命名的则不会。