zoukankan      html  css  js  c++  java
  • 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的转换。

  • 相关阅读:
    函数的调用-转载
    HTML常用标签-手打抄录-来自-烟雨飘零-拜谢
    CSS常用标签-手打抄录-感谢原未知博主-拜谢了
    JS函数表达的几种写法
    JS数组---转及补充--
    标准文档流特性-不含块级元素和行内元素
    块级元素和行内元素-标签收集-区别之处
    CSS盒子知识
    把应用push到/system/app上面后,出现java.lang.UnsatisfiedLinkError的问题
    Vysor:在电脑里控制你的安卓手机
  • 原文地址:https://www.cnblogs.com/charlee44/p/10803025.html
Copyright © 2011-2022 走看看