zoukankan      html  css  js  c++  java
  • 文件路径分解与批处理文件遍历

    本文主要介绍:

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

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

     一、文件路径分解:

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

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

    运行结果:

    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";  运行结果:

    注: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 0while(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,'',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>

  • 相关阅读:
    分数加减法
    两点距离
    1的个数
    Swift 了解(1)
    ARC快速入门
    ARC基本概念
    autorelease注意事项
    autorelease基本使用
    NSTimer的使用
    如何监听控件的行为
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/7699824.html
Copyright © 2011-2022 走看看