c/c++语言开发共享C++枚举某个目录下所有文件的代码教程

c++枚举某个目录下所有文件 标签(空格分隔): iso c++ c++提供文件遍历的方法如下 一个结构体 三个函数 struct _finddata32_t { unsigned at


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, '');     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;  }    

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/607505.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐