C++获取指定文件夹下的文件名(含路径)

C++获取指定文件夹下的文件名(含路径)

代码

// 类声明
#pragma once

#include <iostream>
#include <string>
#include <string.h>
#include "cstdlib"
#include "direct.h"
#include <io.h>
#include <vector>

//using namespace std;

class CBrowseDirBase
{
public:
	CBrowseDirBase(void);
	~CBrowseDirBase(void);

public:
protected:
	//存放初始目录的绝对路径,以'\'结尾
	char m_szInitDir[_MAX_PATH];

	char m_oldworkPathDir[_MAX_PATH];

public:

	bool SetInitDir(const std::string dir);

	//开始遍历初始目录及其子目录下由filespec指定类型的文件
	//filespec可以使用通配符 * ?,不能包含路径。
	//如果返回false,表示遍历过程被用户中止
	bool BrowseCurrentPathFile(const std::string dir,const std::string filespec,std::vector<std::string>&fileNames);
	bool BrowseCurrentPath(const std::string dir,std::vector<std::string>&pathNames);
	
	//遍历目录dir下由filespec指定的文件
	//对于子目录,采用迭代的方法
	//如果返回false,表示中止遍历文件
	
	bool BrowseDir(const std::string dir,const std::string filespec);

protected:


	//函数BrowseDir每找到一个文件,就调用ProcessFile
	//并把文件名作为参数传递过去
	//如果返回false,表示中止遍历文件
	//用户可以覆写该函数,加入自己的处理代码
	virtual bool ProcessFile(const std::string filename);

	//函数BrowseDir每进入一个目录,就调用ProcessDir
	//并把正在处理的目录名及上一级目录名作为参数传递过去
	//如果正在处理的是初始目录,则parentdir=NULL
	//用户可以覆写该函数,加入自己的处理代码
	//比如用户可以在这里统计子目录的个数
	virtual bool ProcessDir(const std::string currentdir,const std::string parentdir);
};



//从CBrowseDirBase派生出的子类,用来统计目录中的文件及子目录个数
class CBrowseDir:public CBrowseDirBase
{
protected:
	int m_nFileCount;   //保存文件个数
	int m_nSubdirCount; //保存子目录个数

public:
	//缺省构造器
	CBrowseDir()
	{
		//初始化数据成员m_nFileCount和m_nSubdirCount
		m_nFileCount=m_nSubdirCount=0;
	}

	//返回文件个数
	int GetFileCount()
	{
		return m_nFileCount;
	}

	//返回子目录个数
	int GetSubdirCount()
	{
		//因为进入初始目录时,也会调用函数ProcessDir,
		//所以减1后才是真正的子目录个数。
		return m_nSubdirCount;
	}

protected:
	//覆写虚函数ProcessFile,每调用一次,文件个数加1
	virtual bool ProcessFile(const std::string filename)
	{
		m_nFileCount++;
		return CBrowseDirBase::ProcessFile(filename);
	}

	//覆写虚函数ProcessDir,每调用一次,子目录个数加1
	virtual bool ProcessDir
		(const std::string currentdir,const std::string parentdir)
	{
		m_nSubdirCount++;
		CBrowseDirBase::ProcessDir(currentdir,parentdir);
		return true;
	}
};
// 类实现
#include "BrowseDirBase.h"

CBrowseDirBase::CBrowseDirBase()
{
	memset(m_szInitDir,0,sizeof(m_szInitDir) );
	memset(m_oldworkPathDir,0,sizeof(m_oldworkPathDir));
	//获取当前路径
	_getcwd(m_szInitDir,sizeof(m_szInitDir));

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat_s(m_szInitDir,"\\");

	memcpy( m_oldworkPathDir ,m_szInitDir, sizeof( m_oldworkPathDir)  );
	
}

CBrowseDirBase::~CBrowseDirBase()
{

}

bool CBrowseDirBase::SetInitDir(const std::string dir)
{
	CBrowseDirBase();

	memset(m_szInitDir,0,sizeof(m_szInitDir));
	//先把dir转换为绝对路径
	if (_fullpath(m_szInitDir,dir.c_str(),sizeof(m_szInitDir)) == NULL)
		return false;

	//判断目录是否存在,并设置当前路径
	if (_chdir(m_szInitDir) != 0)
		return false;

	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat_s(m_szInitDir,"\\");

	return true;
}

bool CBrowseDirBase::BrowseDir(const std::string dir,const std::string filespec)
{
	if (!SetInitDir(dir))
	{
		return false;
	}

	std::string Pathstr = m_szInitDir;

	if (_chdir(Pathstr.c_str()) != 0)
	{
		return false;
	}

	//首先查找dir中符合要求的文件
	long hFile =0;
	_finddata_t fileinfo ={0};
	if ((hFile=_findfirst(filespec.c_str(),&fileinfo)) != -1)
	{
		do
		{
			//查找文件
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				std::string filename = Pathstr + fileinfo.name;

				std::cout << filename << std::endl;
				if (!ProcessFile(filename))
					return false;
			}

		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	//目录
	hFile =0;

	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{

			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					std::string subdir = Pathstr + fileinfo.name+"\\";

					std::cout << subdir << std::endl;
					ProcessDir(subdir,dir);

					BrowseDir(subdir,filespec);
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}

	_chdir(m_oldworkPathDir);

	return true;
}

// dir:文件路径;filespec:文件类型;fileNames:存放文件名称(含路径)的容器
bool CBrowseDirBase::BrowseCurrentPathFile(const std::string dir,const std::string filespec,std::vector<std::string>&fileNames)
{
	
	if (!SetInitDir(dir))
	{
		return false;
	}


	std::string Pathstr = m_szInitDir;

	if (_chdir(Pathstr.c_str()) != 0)
	{
		return false;
	}

	//首先查找dir中符合要求的文件
	long long hFile =0;     // long long类型在64位程序下可以使用,long类型只能在32位下使用
	_finddata_t fileinfo ={0};
	if ((hFile=_findfirst(filespec.c_str(),&fileinfo)) != -1)
	{
		do
		{
			//文件
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				std::string filename = Pathstr + fileinfo.name;  // 路径+名字,路径以“\“隔开
				fileNames.push_back(filename);
				if (!ProcessFile(filename))
					return false;
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	_chdir(m_oldworkPathDir);

	return true;
}

bool CBrowseDirBase::BrowseCurrentPath(const std::string dir,std::vector<std::string>&pathNames)
{

	if (!SetInitDir(dir))
	{
		return false;
	}
	
	std::string Pathstr = m_szInitDir;

	if (_chdir(Pathstr.c_str()) != 0)
	{
		return false;
	}

	//目录
	long hFile =0;
	_finddata_t fileinfo ={0};

	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{

			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					std::string subdir = Pathstr + fileinfo.name+"\\";

					//cout << subdir << std::endl;
					ProcessDir(subdir,dir);

					pathNames.push_back(subdir);
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}

	_chdir(m_oldworkPathDir);

	return true;
}

bool CBrowseDirBase::ProcessFile(const std::string filename)
{
	return true;
}

bool CBrowseDirBase::ProcessDir(const std::string currentdir,const std::string parentdir)
{

	return true;
}

// 示例
#include "BrowseDirBase.h"

int main()
{
	CBrowseDir browse_dir;
	std::vector<std::string> files_vec;
	browse_dir.BrowseCurrentPathFile("xxxxxxxxxxxx", "*.*", files_vec);
	for (auto iter = files_vec.cbegin(); iter != files_vec.cend(); ++iter)
	{
		std::cout << *iter << std::endl;
	}

	system("pause");

	return 0;
}

你可能感兴趣的:(C++)