#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
void _splitpath(const char *path, //要分解的完整路径 char *drive, //返回:磁盘 char *dir, //返回:文件路径 char *fname, //返回:文件名 char *ext ); //返回:后缀名
调用示例如下:
[cpp]
view plain
copy
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
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
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
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
//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 |