c++修改文件名后缀 文件路径分解与批处理文件遍历 您所在的位置:网站首页 路径加文件名 c++修改文件名后缀 文件路径分解与批处理文件遍历

c++修改文件名后缀 文件路径分解与批处理文件遍历

2024-06-30 00:30| 来源: 网络整理| 查看: 265

 #include #include #include #include using namespace std;

int main(int argc, char *argv[]) {     DIR *dirp=NULL;     struct dirent *dp = NULL;     char doing_file[1024];     dirp = opendir("F:/Dev-Cpp/changename");     FILE  *doing_fd;     if(dirp == NULL)   {    printf("打开文件失败!nn");    system("PAUSE");             return EXIT_SUCCESS;   }     while( (dp = readdir(dirp)) != NULL )   {   // printf("..readdir:%sn",dp->d_name);       sprintf(doing_file,"%s",dp->d_name);       string filename_old(doing_file); //改名前的文件名       string filename_new(doing_file); //改名后的文件       string::size_type point = filename_new.rfind("bmp");       if(point != string::npos)       {                 filename_new.replace(point,3,"jpg");                 if(rename(filename_old.c_str(),filename_new.c_str()) == 0)                 {                    printf("改名成功完成nn");                                                                  }                 else                     perror("rename");                 }         }      closedir(dirp);     system("PAUSE");     return EXIT_SUCCESS; }

文件路径分解与批处理文件遍历 标签: 文件路径分解文件路径解析批处理文件遍历主动找下一个文件 2014-11-24 18:13  558人阅读  评论(0)  收藏  举报   分类:  

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文主要介绍:

   一、文件路径分解,即根据获取的文件路径,分解出文件的路径、磁盘、文件名、文件类型。

   二、批处理文件遍历,即根据第一个文件,自动搜索获取该文件夹下的下一个文件路径。

 一、文件路径分解:

文件路径分解主要介绍两种方法:

1.调用分解函数_splitpath:

该函数形式及参数说明如下:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 void _splitpath(const char *path, //要分解的完整路径                   char *drive,    //返回:磁盘                   char *dir,      //返回:文件路径                   char *fname,    //返回:文件名                   char *ext );    //返回:后缀名   调用示例如下:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 char drive[_MAX_DRIVE];      char dir[_MAX_DIR];   char fname[_MAX_FNAME];      char ext[_MAX_EXT];   _splitpath(lpszPathName, drive, dir, fname, ext);    注:_MAX_DRIVER  _MAX_DIR等在stdlib.h中,注意添加头文件  #include 。

2.利用CString相关函数分解:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 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相关函数分解:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 string str;   int m = str.rfind("."); //逆向寻找 “.” 返回值为正着数“.”的字符位置      substr:从字符串中截取一部分,第一个参数为截取的起点,起点从0开始数                                 第二个参数为截取的长度,长度从起点数起      int n = str.rfind("\\");   string dir = str.substr(0,n); //获取文件夹路径   string name = str.substr(n+1,str.length()-n-1); //从路径中获取文件的名字    令 str = "F:\\123.tif";  运行结果:

注:1. CString 和string中的find函数返回的位置数,都由字符串从0开始编号数起的;

        2. 截取长度都是从当前位置开始计算,长度数为截取的字符个数;

        3. 因此获取的位置数与截取的长度数偏差一个字符。

二、批处理文件遍历:

批处理文件遍历也介绍两种方法:

1.WIN32_FIND_DATA类实现:

头文件为:#include "windows.h"

MFC或者ANSIC(多字节编码)编码下,主要函数:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 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编码下,具体实现:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片 //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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有