• VC遍历访问目录下的文件


    访问目录文件夹下的文件是经常需要的操作,C/C++和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过MFC的CFileFind函数递归遍历实现,包括以下几个功能函数:

    1. 查找目录下所有的文件夹;
    2. 查找目录下所有的文件(不遍历目录的目录);
    3. 查找目录下所有的文件(遍历目录的目录) ;
    4. 查找目录下某一类型文件 (不遍历目录的目录);
    5. 查找目录下某一类型文件 (遍历目录的目录);
    //查找目录下所有的文件夹
    void FindFolder(string dir, vector<string> &folderPath)
    {
    	CFileFind fileFinder;
    	CString filePath = CString(dir.c_str()) + _T("\*.*");
    
    	BOOL bFinished = fileFinder.FindFile(filePath);
    	while (bFinished)  //每次循环对应一个类别目录
    	{
    		bFinished = fileFinder.FindNextFile();
    		if (fileFinder.IsDirectory() && !fileFinder.IsDots())  //fileFinder.IsDots()识别"."文件和".."文件
    		{
    			CString filePath = fileFinder.GetFilePath();
    			folderPath.push_back(filePath.GetBuffer());
    			filePath.ReleaseBuffer();
    		}
    	}
    
    	fileFinder.Close();
    }
    
    //查找目录下所有的文件(不遍历目录的目录)	
    void FindDirFileNoFormat(string dir, vector<string> &filePath)
    {
    	CFileFind fileFinder;
    	CString path = CString(dir.c_str()) + _T("\*.*");
    
    	BOOL bFinished = fileFinder.FindFile(path);
    	while (bFinished)  //每次循环对应一个类别目录
    	{
    		bFinished = fileFinder.FindNextFile();
    		if (fileFinder.IsDirectory() || fileFinder.IsDots())  //fileFinder.IsDots()识别"."文件和".."文件
    		{
    			continue;
    		}
    		else
    		{
    			CString findPath = fileFinder.GetFilePath();
    			filePath.push_back(findPath.GetBuffer());
    			findPath.ReleaseBuffer();
    		}
    	}
    
    	fileFinder.Close();
    }
    
    //查找目录下所有的文件(遍历目录的目录)	
    void FindAllFileNoFormat(string dir, vector<string> &filePath)
    {
    	CFileFind fileFinder;
    	CString path = CString(dir.c_str()) + _T("\*.*");
    
    	BOOL bFinished = fileFinder.FindFile(path);
    	while (bFinished)  //每次循环对应一个类别目录
    	{
    		bFinished = fileFinder.FindNextFile();
    
    		// 跳过 . 和 .. ; 否则会陷入无限循环中!!!
    		if (fileFinder.IsDots())
    		{
    			continue;
    		}
    
    		//
    		if (fileFinder.IsDirectory())
    		{
    			CString findPath = fileFinder.GetFilePath();
    			string subdir = findPath.GetBuffer();
    			FindAllFileNoFormat(subdir, filePath);
    			findPath.ReleaseBuffer();
    		}
    		else
    		{
    			CString findPath = fileFinder.GetFilePath();
    			filePath.push_back(findPath.GetBuffer());
    			findPath.ReleaseBuffer();
    		}
    	}
    
    	fileFinder.Close();
    }
    
    // 查找目录下某一类型文件 (不遍历目录的目录)
    void FindDirFile(string dir, string format, vector<string> &filePath)
    {
    	CFileFind fileFinder;
    	CString path = CString(dir.c_str()) + _T("\*") + CString(format.c_str());
    
    	BOOL bFinished = fileFinder.FindFile(path);
    	while (bFinished)  //每次循环对应一个类别目录
    	{
    		bFinished = fileFinder.FindNextFile();
    		if (fileFinder.IsDirectory() && !fileFinder.IsDots())  //fileFinder.IsDots()识别"."文件和".."文件
    		{
    			continue;
    		}
    		else
    		{
    			CString findPath = fileFinder.GetFilePath();
    			filePath.push_back(findPath.GetBuffer());
    			findPath.ReleaseBuffer();
    		}
    	}
    
    	fileFinder.Close();
    }
    
    //得到文件路径的格式后缀
    string GetPathFormat(string filePath)
    {
    	string format = filePath;
    	size_t p = filePath.find_last_of('.');
    	if (p == -1)
    	{
    		return string();
    	}
    	format.erase(0, p);
    	return format;
    }
    
    // 查找目录下某一类型文件 (遍历目录的目录)	
    void FindDirAllFileEx(string dir, vector<string> &format, vector<string>& filePath)
    {
    	CFileFind fileFinder;
    	CString path = CString(dir.c_str()) + _T("\*.*");
    
    	BOOL bFinished = fileFinder.FindFile(path);
    	while (bFinished)  //每次循环对应一个类别目录
    	{
    		bFinished = fileFinder.FindNextFile();
    
    		// 跳过 . 和 .. ; 否则会陷入无限循环中!!!
    		if (fileFinder.IsDots())
    		{
    			continue;
    		}
    
    		if (fileFinder.IsDirectory())
    		{
    			CString findPath = fileFinder.GetFilePath();
    			string subdir = findPath.GetBuffer();
    			FindDirAllFileEx(subdir, format, filePath);
    			findPath.ReleaseBuffer();
    		}
    		else
    		{
    			//获取文件类型
    			CString findPath = fileFinder.GetFilePath();
    			string file = findPath.GetBuffer();
    			string postfix = GetPathFormat(file);
    
    			bool flag = false;
    			for (auto it : format)
    			{
    				if (_stricmp(it.c_str(), postfix.c_str()) == 0)
    				{
    					flag = true;
    					break;
    				}
    			}
    
    			if (flag)
    			{
    				filePath.push_back(file);
    			}
    
    			findPath.ReleaseBuffer();
    		}
    	}
    
    	fileFinder.Close();
    }
    

    有一点值得注意的是我这里函数的参数都封装成STL的string,在多字节下可以直接使用,在unicode下需要稍微修改下CString与string的转换。

  • 相关阅读:
    SVN:多版本库环境的搭建
    记一次KUBERNETES/DOCKER网络排障
    k8s部署prometheus
    误删除 linux 系统文件了?这个方法教你解决
    kubectl命令自动补全
    git杂记:忽略ssl认证
    微软官方原版本下载msdn
    Android Studio 小技巧(2):AS中Button文字默认大写的问题
    <Android 基础(十一)> Snackbar
    <Android 基础(十)> FloatingActionButton
  • 原文地址:https://www.cnblogs.com/charlee44/p/10803025.html
Copyright © 2020-2023  润新知