c++完成的修改文件名后缀
(2012-04-16 16:35:02) 标签: 转载 | 分类: programming |
#include <iostream>
#include <dirent.h>
#include <fcntl.h>
using namespace std;
int main(int argc, char *argv[])
{
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文主要介绍:
一、文件路径分解,即根据获取的文件路径,分解出文件的路径、磁盘、文件名、文件类型。
二、批处理文件遍历,即根据第一个文件,自动搜索获取该文件夹下的下一个文件路径。
一、文件路径分解:
文件路径分解主要介绍两种方法:
1.调用分解函数_splitpath:
该函数形式及参数说明如下:
- void _splitpath(const char *path, //要分解的完整路径
- char *drive, //返回:磁盘
- char *dir, //返回:文件路径
- char *fname, //返回:文件名
- char *ext ); //返回:后缀名
- char drive[_MAX_DRIVE];
- char dir[_MAX_DIR];
- char fname[_MAX_FNAME];
- char ext[_MAX_EXT];
- _splitpath(lpszPathName, drive, dir, fname, ext);
2.利用CString相关函数分解:
- CString m_strOriFileName(lpszPathName); //lpszPathName转成CString型m_strOriFileName
- int n = m_strOriFileName.ReverseFind('\\')+1;
- CString strPath=m_strOriFileName.Left(n); //获取路径
- int m =m_strOriFileName.GetLength()-n;
- CString strName = m_strOriFileName.Right(m); //获取文件名
- int k=m_strOriFileName.GetLength()-m_strOriFileName.ReverseFind('.')-1; //获取文件类型
- CString strType=m_strOriFileName.Right(k);
注:该方法主要利用路径的组成形式和CString的函数,对整个路径进行截取。
运行结果:
3.利用string相关函数分解:
- string str;
- int m = str.rfind("."); //逆向寻找 “.” 返回值为正着数“.”的字符位置<从0开始数>
- substr:从字符串中截取一部分,第一个参数为截取的起点,起点从0开始数
- 第二个参数为截取的长度,长度从起点数起
- int n = str.rfind("\\");
- string dir = str.substr(0,n); //获取文件夹路径
- string name = str.substr(n+1,str.length()-n-1); //从路径中获取文件的名字
注:1. CString 和string中的find函数返回的位置数,都由字符串从0开始编号数起的;
2. 截取长度都是从当前位置开始计算,长度数为截取的字符个数;
3. 因此获取的位置数与截取的长度数偏差一个字符。
二、批处理文件遍历:
批处理文件遍历也介绍两种方法:
1.WIN32_FIND_DATA类实现:
头文件为:#include "windows.h"
MFC或者ANSIC(多字节编码)编码下,主要函数:
- WIN32_FIND_DATA fd;
- HANDLE hFind;
- CString strFileName;
- hFind = ::FindFirstFile(lzpath+"*.bmp", &fd); //lzpath为文件路径,不包含文件名
- //返回值:如果搜索成功则返回搜索句柄,失败就返回INVALID_HANDLE_VALUE
- if(hFind == INVALID_HANDLE_VALUE)
- return 0 ;
- while(1)
- {
- strFileName = fd.cFileName;
- if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0
- break;
- }
- ::FindClose(hFind);
在UNICODE编码下,具体实现:
- //UNICODE编码下,遍历文件或者文件夹
- /***********************************************************************
- 函数名称:StringToLPCWSTR
- 函数功能:字符串转化,string转化为 LPCWSTR
- 函数参数:
- orig :string字符串
- 返回值: 转化结果
- 创建人 :
- 创建时间:2016.3.4
- 备注:
- ***********************************************************************/
- LPCWSTR StringToLPCWSTR(string orig)
- {
- WCHAR wszClassName[256];
- memset(wszClassName,'\0',sizeof(wszClassName));
- MultiByteToWideChar(CP_ACP,0,orig.c_str(),-1,wszClassName,
- sizeof(wszClassName)/sizeof(wszClassName[0]));
- return wszClassName;
- }
- /***********************************************************************
- 函数名称:ConvertLPWSTRToChar
- 函数功能:字符串转化,LPCWSTR转化为char*
- 函数参数:
- lpwszStrIn :LPCWSTR字符串
- 返回值: 转化结果
- 创建人 :
- 创建时间:2016.3.4
- 备注:
- ***********************************************************************/
- char* ConvertLPWSTRToChar (LPWSTR lpwszStrIn)
- {
- LPSTR pszOut = NULL;
- if (lpwszStrIn != NULL)
- {
- int nInputStrLen = wcslen (lpwszStrIn);
- int nOutputStrLen = WideCharToMultiByte (CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
- pszOut = new char [nOutputStrLen];
- if (pszOut)
- {
- memset (pszOut, 0x00, nOutputStrLen);
- WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
- }
- }
- return pszOut;
- }
- bool ExtractSameFile(string fileDir)
- {
- string strTemp;
- WIN32_FIND_DATA fd;
- HANDLE hFind;
- string strFileName, srcFolder;
- strTemp = fileDir + "*";
- WCHAR wcharTemp[256]; //string 转 LPWSTRT
- MultiByteToWideChar(CP_ACP,0,strTemp.c_str(),-1,wcharTemp,sizeof(wcharTemp)/sizeof(wcharTemp[0]));
- hFind = FindFirstFile(wcharTemp, &fd); //lzpath为文件路径,不包含文件名
- //返回值:如果搜索成功则返回搜索句柄,失败就返回INVALID_HANDLE_VALUE
- if(hFind == INVALID_HANDLE_VALUE)
- return 0 ;
- while(1)
- {
- strFileName = ConvertLPWSTRToChar(fd.cFileName);
- if(strFileName=="."|| strFileName=="..") //如果查找所有文件 ”*“,得到的返回值前两个是 . .. 第三个开始才是
- //真实的文件名;如果查找特定文件,加 ”*.文件类型“,如”.txt“
- {
- if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0
- break;
- continue;
- }
- cout<<strFileName<<endl;
- if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0
- break;
- }
- ::FindClose(hFind);
- return true;
- }
2.MFC类CFileFind实现:
- CFileFind finder;
- CString strFileName;
- BOOL bWorking = finder.FindFile(lzpath+"*.bmp");//查找该目录下的指定文件bmp,此时没有指向文件
- if(!bWorking)
- return 0;
- while(1)
- {
- bWorking = finder.FindNextFile(); //指向文件
- if(!Working)
- break;
- strFileName = finder.GetFileName();
- }