欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++枚举某个目录下所有文件的代码教程

程序员文章站 2022-08-05 21:06:07
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, '\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;
}