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

本文主要介绍:

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

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

 一、文件路径分解:

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

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); 
注:_MAX_DRIVER  _MAX_DIR等在stdlib.h中,注意添加头文件  #include <stdlib.h>。

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的函数,对整个路径进行截取。

运行结果:

文件路径分解与批处理文件遍历_第1张图片

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); //从路径中获取文件的名字 
令 str = "F:\\123.tif";  运行结果:

文件路径分解与批处理文件遍历_第2张图片

注: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();
		}
注:该类的头文件为:#include <windows.h>


你可能感兴趣的:(批处理,文件遍历,文件路径解析,主动找下一个文件,文件路径分解)