我有一项任务,我需要浏览文件夹中的所有文件。对于每个文件,我需要知道每个唯一的文件扩展名,每个唯一文件扩展名的文件数以及每个唯一文件扩展名的总大小。我必须能够使用文件扩展名或文件扩展名的总大小对此进行排序。我想到的第一件事是地图。这将跟踪每个唯一的文件扩展名和找到文件扩展名的次数。我现在如何将文件扩展名的总大小与我的地图相关联?所以例如我需要输出如下:
使用文件扩展名进行排序 .cpp:1:3400 .exe:3:3455600 .mp4:25:200000404
使用总文件扩展名大小进行排序 .mp4:25:200000404 .exe:3:3455600 .cpp:1:3400
以下是我编辑后的代码:
#include <iostream>
#include <filesystem>
#include <map>
using namespace std;
using namespace std::tr2::sys;
class fileInfo {
public:
int fileCount;
long long fileSize;
};
void scan(path f)
{
map<string, fileInfo> fileMap;
cout << "Scanning = " << system_complete(f) << endl;
directory_iterator d(f);
directory_iterator e;
for( ; d != e; ++d)
{
path p = d->path();
cout << "\nExtension is: " << extension(p) << "\tFile size is: " << file_size(p) << endl;
fileMap[extension(p)].fileCount ++;
fileMap[extension(p)].fileSize += file_size(p);
}
for (map<string, fileInfo>::iterator it = fileMap.begin(); it != fileMap.end(); ++it)
{
cout << it->first << " : " << it->second.fileCount << " : " << it->second.fileSize << endl;
}
}
int main(int argc, char* argv[] )
{
path folder = "..";
scan(folder);
return 0;
}
编辑:所以我已经实现了类fileInfo。它有点工作。但是我遇到了file_size的问题。在第一次运行循环之后,它正确返回file_size,但是对于每个其他运行循环,file_size返回0。
答案 0 :(得分:0)
您可以创建一个地图:
map<string, vector<int> > fileExtToSizeMap;
基本上,对于string
格式的每个文件扩展名,如果当前文件与该扩展名相关联,请将文件大小放入向量vector<int>
。扫描完目录后,该向量的大小将告诉您how many files are associated with the file extension
,向量的总和将告诉您the total size for each unique file extension
。然后,您可以通过此数据结构回答两个主要问题。
答案 1 :(得分:0)
我会像这样创建一个数据结构,例如ExtensionStat
:
struct ExtensionStat {
int totalFile;
int totalSize;
};
并有一个从扩展名到地图
的地图map<string, ExtensionStat> extMap;
然后,您只需将收集统计信息的文件夹内容重复到extMap
。请记住,您不需要使用struct,也可以使用class。如果您想避免全价值复制,也可以选择地图为map<string, ExtensionStat*> extMap;
答案 2 :(得分:0)
您也可以使用多地图
map<string, size_t> fileExtSizeMap;
简单地为遇到的每个文件添加一个新条目。
std :: lower_bound和std :: upperbound可用于搜索此结构。在生成的迭代器上使用std :: distance来获取文件计数。
或者直接遍历完整的地图,在你去的时候递增一个计数器。