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

c++完成的修改文件名后缀

  (2012-04-16 16:35:02)
标签: 

转载

分类: programming
原文地址:c++完成的修改文件名后缀 作者:cyclone
http://blog.sina.com.cn/s/blog_6294abe701013ekg.html

 #include <cstdlib>
#include <iostream>
#include <dirent.h>
#include <fcntl.h>
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;
}



文件路径分解与批处理文件遍历

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

本文主要介绍:

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

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

 一、文件路径分解:

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

1.调用分解函数_splitpath:

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

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

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

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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. CString m_strOriFileName(lpszPathName); //lpszPathName转成CString型m_strOriFileName  
  2. int n = m_strOriFileName.ReverseFind('\\')+1;  
  3. CString  strPath=m_strOriFileName.Left(n); //获取路径  
  4.   
  5. int m =m_strOriFileName.GetLength()-n;  
  6. CString strName = m_strOriFileName.Right(m); //获取文件名  
  7.   
  8. int k=m_strOriFileName.GetLength()-m_strOriFileName.ReverseFind('.')-1; //获取文件类型  
  9. CString strType=m_strOriFileName.Right(k);  

注:该方法主要利用路径的组成形式和CString的函数,对整个路径进行截取。

运行结果:


3.利用string相关函数分解:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. string str;  
  2. int m = str.rfind("."); //逆向寻找 “.” 返回值为正着数“.”的字符位置<从0开始数>  
  3.   
  4. substr:从字符串中截取一部分,第一个参数为截取的起点,起点从0开始数  
  5.                               第二个参数为截取的长度,长度从起点数起  
  6.   
  7. int n = str.rfind("\\");  
  8. string dir = str.substr(0,n); //获取文件夹路径  
  9. 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上查看代码片 派生到我的代码片
  1. WIN32_FIND_DATA fd;  
  2. HANDLE hFind;  
  3. CString strFileName;  
  4. hFind = ::FindFirstFile(lzpath+"*.bmp", &fd);  //lzpath为文件路径,不包含文件名  
  5.                                                //返回值:如果搜索成功则返回搜索句柄,失败就返回INVALID_HANDLE_VALUE  
  6. if(hFind == INVALID_HANDLE_VALUE)  
  7.     return 0 ;  
  8. while(1)  
  9. {  
  10.     strFileName = fd.cFileName;  
  11.     if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0  
  12.         break;  
  13. }  
  14.   
  15. ::FindClose(hFind);  

在UNICODE编码下,具体实现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //UNICODE编码下,遍历文件或者文件夹  
  2. /*********************************************************************** 
  3.     函数名称:StringToLPCWSTR 
  4.     函数功能:字符串转化,string转化为 LPCWSTR 
  5.     函数参数: 
  6.             orig    :string字符串 
  7.          
  8.     返回值: 转化结果 
  9.     创建人 : 
  10.     创建时间:2016.3.4 
  11.     备注: 
  12. ***********************************************************************/  
  13. LPCWSTR StringToLPCWSTR(string orig)  
  14. {  
  15.     WCHAR wszClassName[256];    
  16.     memset(wszClassName,'\0',sizeof(wszClassName));    
  17.     MultiByteToWideChar(CP_ACP,0,orig.c_str(),-1,wszClassName,  
  18.         sizeof(wszClassName)/sizeof(wszClassName[0]));    
  19.   
  20.     return wszClassName;  
  21. }  
  22.   
  23. /*********************************************************************** 
  24.     函数名称:ConvertLPWSTRToChar 
  25.     函数功能:字符串转化,LPCWSTR转化为char* 
  26.     函数参数: 
  27.             lpwszStrIn  :LPCWSTR字符串 
  28.          
  29.     返回值: 转化结果 
  30.     创建人 : 
  31.     创建时间:2016.3.4 
  32.     备注: 
  33. ***********************************************************************/  
  34. char*  ConvertLPWSTRToChar (LPWSTR lpwszStrIn)    
  35. {    
  36.     LPSTR pszOut = NULL;    
  37.     if (lpwszStrIn != NULL)    
  38.     {    
  39.         int nInputStrLen = wcslen (lpwszStrIn);    
  40.     
  41.         int nOutputStrLen = WideCharToMultiByte (CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;    
  42.         pszOut = new char [nOutputStrLen];    
  43.     
  44.         if (pszOut)    
  45.         {    
  46.             memset (pszOut, 0x00, nOutputStrLen);    
  47.             WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);    
  48.         }    
  49.     }    
  50.     return pszOut;    
  51. }    
  52.   
  53. bool ExtractSameFile(string fileDir)  
  54. {  
  55.   
  56.     string strTemp;  
  57.   
  58.     WIN32_FIND_DATA fd;    
  59.     HANDLE hFind;    
  60.   
  61.     string strFileName, srcFolder;   
  62.     strTemp = fileDir + "*";  
  63.   
  64.     WCHAR wcharTemp[256];  //string 转 LPWSTRT  
  65.     MultiByteToWideChar(CP_ACP,0,strTemp.c_str(),-1,wcharTemp,sizeof(wcharTemp)/sizeof(wcharTemp[0]));   
  66.   
  67.     hFind = FindFirstFile(wcharTemp, &fd);  //lzpath为文件路径,不包含文件名    
  68.                                         //返回值:如果搜索成功则返回搜索句柄,失败就返回INVALID_HANDLE_VALUE    
  69.     if(hFind == INVALID_HANDLE_VALUE)    
  70.         return 0 ;    
  71.     while(1)    
  72.     {    
  73.         strFileName = ConvertLPWSTRToChar(fd.cFileName);    
  74.         if(strFileName=="."|| strFileName==".."//如果查找所有文件 ”*“,得到的返回值前两个是 . .. 第三个开始才是  
  75.                                                  //真实的文件名;如果查找特定文件,加 ”*.文件类型“,如”.txt“  
  76.         {  
  77.             if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0    
  78.                 break;    
  79.             continue;  
  80.         }  
  81.   
  82.   
  83.         cout<<strFileName<<endl;  
  84.           
  85.         if(!::FindNextFile(hFind, &fd)) //返回值:成功返回非0 ,失败返回0    
  86.             break;    
  87.     }    
  88.     
  89.     ::FindClose(hFind);    
  90.   
  91.     return true;  
  92. }  


2.MFC类CFileFind实现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. CFileFind finder;   
  2.         CString strFileName;  
  3.         BOOL bWorking = finder.FindFile(lzpath+"*.bmp");//查找该目录下的指定文件bmp,此时没有指向文件  
  4.         if(!bWorking)  
  5.             return 0;  
  6.         while(1)  
  7.         {  
  8.             bWorking = finder.FindNextFile(); //指向文件  
  9.             if(!Working)  
  10.                 break;  
  11.             strFileName = finder.GetFileName();  
  12.         }  
注:该类的头文件为:#include <windows.h>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值