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;
}