您的位置:首页 > 编程语言 > C语言/C++

C++批量读取文件信息(包括子文件夹)

2020-04-29 11:29 99 查看

这里使用的结构体是

_finddata_t

struct _finddata_t
{
unsigned attrib;//文件属性
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;  //文件大小,返回字节数
char name[_MAX_FNAME];//文件名
};

attrib
:文件属性,用位表示,主要有以下一些:
_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)
。这些宏,可以直接使用。那么当一个文件有某个属性时,是通过位与的方式,来探测是否具有这个属性。

注意,每个文件夹都有

‘.’
当前目录,
'..'
上目录,此时可以忽略他们。
注意,使用
path=C:\\Program Files
,仅仅读取的是这个文件夹的信息,要想读取文件夹内的文件,需要
path=C:\\Program Files\\*
,重点是
*
号。

#include <io.h>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>

long SumofB = 0;
using namespace std;
void getFiles(string path, map<string,long>& files)
{

long    hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR)) //检测是否为文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) //检测是否为当前目录或上目录,是就忽略
{
if (path.find('*')!=string::npos)
{
p.assign(path);
p.erase(path.find('*'), path.find('*') + 1);
getFiles(p.append(fileinfo.name).append("\\*"), files); //探索子文件夹
}
else
{
getFiles(p.assign(path).append("\\*"), files);

}
}
}
else
{
p.assign(path);
p.erase(path.find('*'), path.find('*') + 1);
p.append(fileinfo.name);
files.insert(pair<string,long>(p,fileinfo.size));   //存储路径+文件名,大小
SumofB += fileinfo.size;
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

int main(int argc,char*argv)
{
map<string,long> files;
getFiles("C:\\Program Files", files);
for_each(files.begin(), files.end(), [](pair<string,long>i) {cout << i.first << endl;});
cout << SumofB << endl;  //计算所有文件大小
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐