C++枚举某个目录下所有文件的代码教程
c++枚举某个目录下所有文件
标签(空格分隔): iso c++
c++提供文件遍历的方法如下
一个结构体
三个函数
struct _finddata32_t { unsigned attrib;//文件属性 __time32_t time_create; // 创建时间 __time32_t time_access; // 最后访问时间 __time32_t time_write; //最后写入时间 _fsize_t size; //文件大小 char name[260];//文件名 };
文件有如下属性
// file attribute constants for the _findfirst() family of functions #define _a_normal 0x00 // 正常文件没有读写限制 #define _a_rdonly 0x01 // 只读文件 #define _a_hidden 0x02 // 隐藏文件 #define _a_system 0x04 // 系统文件 #define _a_subdir 0x10 // 目录 #define _a_arch0x20 // 存档文件
枚举文件
intptr_t _findfirst( const char *filespec, struct _finddata_t *fileinfo ); intptr_t _findfirst32( const char *filespec, struct _finddata32_t *fileinfo ); intptr_t _findfirst64( const char *filespec, struct _finddata64_t *fileinfo ); intptr_t _findfirsti64( const char *filespec, struct _finddatai64_t *fileinfo ); intptr_t _findfirst32i64( const char *filespec, struct _finddata32i64_t *fileinfo ); intptr_t _findfirst64i32( const char *filespec, struct _finddata64i32_t *fileinfo ); intptr_t _wfindfirst( const wchar_t *filespec, struct _wfinddata_t *fileinfo ); intptr_t _wfindfirst32( const wchar_t *filespec, struct _wfinddata32_t *fileinfo ); intptr_t _wfindfirst64( const wchar_t *filespec, struct _wfinddata64_t *fileinfo ); intptr_t _wfindfirsti64( const wchar_t *filespec, struct _wfinddatai64_t *fileinfo ); intptr_t _wfindfirst32i64( const wchar_t *filespec, struct _wfinddata32i64_t *fileinfo ); intptr_t _wfindfirst64i32( const wchar_t *filespec, struct _wfinddata64i32_t *fileinfo );
参数:
建议使用 visual studio 2017 立即下载
_findfirst、_findfirst32、_findfirst32i64、_findfirst64、_findfirst64i32、_findfirsti64、_wfindfirst、_wfindfirst32、_wfindfirst32i64、_wfindfirst64、_wfindfirst64i32、_wfindfirsti64
visual studio 2015 其他版本
发布日期: 2016年7月
若要了解有关 visual studio 2017 rc 的最新文档,请参阅 visual studio 2017 rc 文档。
提供有关匹配中指定的文件的文件名的第一个实例的信息filespec参数。
intptr_t _findfirst( const char *filespec, struct _finddata_t *fileinfo ); intptr_t _findfirst32( const char *filespec, struct _finddata32_t *fileinfo ); intptr_t _findfirst64( const char *filespec, struct _finddata64_t *fileinfo ); intptr_t _findfirsti64( const char *filespec, struct _finddatai64_t *fileinfo ); intptr_t _findfirst32i64( const char *filespec, struct _finddata32i64_t *fileinfo ); intptr_t _findfirst64i32( const char *filespec, struct _finddata64i32_t *fileinfo ); intptr_t _wfindfirst( const wchar_t *filespec, struct _wfinddata_t *fileinfo ); intptr_t _wfindfirst32( const wchar_t *filespec, struct _wfinddata32_t *fileinfo ); intptr_t _wfindfirst64( const wchar_t *filespec, struct _wfinddata64_t *fileinfo ); intptr_t _wfindfirsti64( const wchar_t *filespec, struct _wfinddatai64_t *fileinfo ); intptr_t _wfindfirst32i64( const wchar_t *filespec, struct _wfinddata32i64_t *fileinfo ); intptr_t _wfindfirst64i32( const wchar_t *filespec, struct _wfinddata64i32_t *fileinfo );
参数
filespec
目标文件规范 (可以包含通配符字符)。
fileinfo
文件信息的缓冲区。
返回值
如果成功,_findfirst返回标识的文件或与匹配的文件组的唯一的搜索句柄,可在后续调用_findnext或_findclose。 否则为_findfirst返回 –&1; 并设置errno为以下值之一。
einval
无效的参数︰filespec或fileinfo已null。 或者,操作系统返回了意外的错误。
enoent
无法将匹配的文件规范。
enomem
内存不足。
einval
无效文件名规范 (或指定的文件名) 不大于max_path。
有关这些属性和其他的更多信息返回代码示例,请参见 _errno、errno、_sys_errlist 和 _sys_nerr。
int _findnext( intptr_t handle, struct _finddata_t *fileinfo ); int _findnext32( intptr_t handle, struct _finddata32_t *fileinfo ); int _findnext64( intptr_t handle, struct __finddata64_t *fileinfo ); int _findnexti64( intptr_t handle, struct __finddatai64_t *fileinfo ); int _findnext32i64( intptr_t handle, struct _finddata32i64_t *fileinfo ); int _findnext64i32( intptr_t handle, struct _finddata64i32_t *fileinfo ); int _wfindnext( intptr_t handle, struct _wfinddata_t *fileinfo ); int _wfindnext32( intptr_t handle, struct _wfinddata32_t *fileinfo ); int _wfindnext64( intptr_t handle, struct _wfinddata64_t *fileinfo ); int _wfindnexti64( intptr_t handle, struct _wfinddatai64_t *fileinfo ); int _wfindnext32i64( intptr_t handle, struct _wfinddatai64_t *fileinfo ); int _wfindnext64i32( intptr_t handle, struct _wfinddata64i32_t *fileinfo );
参数
handle
搜索句柄返回到以前调用_findfirst。
fileinfo
文件信息的缓冲区。
返回值
如果成功,返回 0。 否则为返回 –&1; 并设置errno到一个值,该值故障的性质。 下表中显示可能的错误代码。
einval
无效的参数︰fileinfo已null。 或者,操作系统返回了意外的错误。
enoent
找不到没有更多匹配的文件。
enomem
没有足够的内存或文件名称的长度超出max_path。
示例
#pragma once class cenumfile { public: cenumfile(); cenumfile(std::string szpath,std::string szex = "*.*"); ~cenumfile(); enum { attrib_arch =_a_arch, //存档文件 attrib_hidden=_a_hidden,//隐藏文件 attrib_normal=_a_normal,//正常文件 attrib_rdonly=_a_rdonly,//只读文件 attrib_system=_a_system,//系统文件 attrib_subdir=_a_subdir //目录 }; //设置过滤条件 void setfilter(std::string szpath, std::string szex = "*.*"); //枚举所有文件 std::vector enumfile(); //获取文件访问属性 unsigned getfileattrib(std::string szfilename); //获取文件创建时间 time_t getcreatetime(std::string szfilename); //获取文件最后访问时间 time_t getlastaccesstime(std::string filename); //获取最后写入时间 time_t getlastwritetime(std::string filename); private: std::string m_szpath; //文件路径 std::string m_szex;//文件扩展名 std::string m_szfilter; //枚举过滤 std::string m_szerrorinfo; //错误信息 std::mapm_mapfinddata; //文件信息 };
#include "stdafx.h" #include "enumfile.h" #include #include #include using namespace std; #define exceptionhead "["<<__function__ << "-" << __line__ <<"]" cenumfile::cenumfile() :m_szpath("") ,m_szex("") { } cenumfile::cenumfile(string szpath, string szex) :m_szpath(szpath) ,m_szex(szex) { setfilter(szpath, szex); } cenumfile::~cenumfile() { } void cenumfile::setfilter(std::string szpath, std::string szex) { m_szpath = szpath; m_szex = szex; stringstream ss; ss << m_szpath << "/" << m_szex; ss >> m_szfilter; } vector cenumfile::enumfile() { _finddata_t finddata; vector vecres; intptr_t fileindes = _findfirst(m_szfilter.c_str(), &finddata); assert(-1 != fileindes); if (fileindes < 0) { stringstream ss; ss <> m_szerrorinfo; perror(m_szerrorinfo.c_str()); throw std::exception(m_szerrorinfo.c_str()); } //记录 vecres.push_back(finddata.name); m_mapfinddata.insert(make_pair(finddata.name, finddata)); //遍历 while (_findnext(fileindes,&finddata) >= 0) { //插入 vecres.push_back(finddata.name); m_mapfinddata.insert(make_pair(finddata.name, finddata)); } _findclose(fileindes); return vecres; } //获取文件访问属性 unsigned cenumfile::getfileattrib(string szfilename) { auto iter = m_mapfinddata.find(szfilename); if (iter == m_mapfinddata.end()) { stringstream ss; ss << exceptionhead<<"目录" << m_szpath << "下" << "不存在此文件" << endl; ss >> m_szerrorinfo; perror(m_szerrorinfo.c_str()); throw std::exception(m_szerrorinfo.c_str()); } return iter->second.attrib; } //获取文件创建时间 time_t cenumfile::getcreatetime(string szfilename) { auto iter = m_mapfinddata.find(szfilename); if (iter == m_mapfinddata.end()) { stringstream ss; ss << exceptionhead << "目录" << m_szpath << "下" << "不存在此文件" << endl; ss >> m_szerrorinfo; perror(m_szerrorinfo.c_str()); throw std::exception(m_szerrorinfo.c_str()); } return iter->second.time_create; } //获取文件最后访问时间 time_t cenumfile::getlastaccesstime(string szfilename) { auto iter = m_mapfinddata.find(szfilename); if (iter == m_mapfinddata.end()) { stringstream ss; ss << exceptionhead << "目录" << m_szpath << "下" << "不存在此文件" << endl; ss >> m_szerrorinfo; perror(m_szerrorinfo.c_str()); throw std::exception(m_szerrorinfo.c_str()); } return iter->second.time_access; } //获取最后写入时间 time_t cenumfile::getlastwritetime(string szfilename) { auto iter = m_mapfinddata.find(szfilename); if (iter == m_mapfinddata.end()) { stringstream ss; ss << exceptionhead << "目录" << m_szpath << "下" << "不存在此文件" << endl; ss >> m_szerrorinfo; perror(m_szerrorinfo.c_str()); throw std::exception(m_szerrorinfo.c_str()); } return iter->second.time_write; }
// enumfile.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include "enumfile.h" using namespace std; #pragma warning(disable:4996) string formattime(time_t time,string szformat) { assert(szformat.size() != 0); if (szformat.size() == 0) { throw std::exception("格式化字符串为空"); } tm* ptm; ptm = localtime(&time); string szres(64, '\0'); strftime(&szres[0], szres.size(), szformat.c_str(), ptm); return szres; } int main() { try { cenumfile enumfile("c:/users/善军/desktop"); vector vecfiles = enumfile.enumfile(); cout << vecfiles.size() << endl; for (auto item : vecfiles) { cout << item << ":" << formattime(enumfile.getlastwritetime(item),"%y-%m-%d %h:%m:%s") << endl; } } catch (const std::exception& e) { cout << e.what() << endl; } return 0; }