2013-03-30 65 views
4

我有一个任务,我需要浏览文件夹中的所有文件。对于每个文件,我需要知道每个唯一文件扩展名,每个唯一文件扩展名有多少个文件以及每个唯一文件扩展名的总大小。我必须能够使用文件扩展名或文件扩展名的总大小对此进行排序。我想用的第一件事是一张地图。这将跟踪每个唯一的文件扩展名和文件扩展名被发现的次数。我现在如何将文件扩展名的总大小关联到我的地图?因此,例如我需要的输出是这样的:具有两个键值的映射

使用文件扩展名排序 的.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

您可以创建一个映射:

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。这个数据结构会回答您的两个主要问题。

0

我想创建一个数据结构,如ExtensionStat这样的:

struct ExtensionStat { 
    int totalFile; 
    int totalSize; 
}; 

而且具有扩展名映射到统计

map<string, ExtensionStat> extMap; 

然后你只需重复收集统计数据的文件夹的内容到extMap。请记住,你不需要使用结构,你也可以使用类。你也可以选择地图要map<string, ExtensionStat*> extMap;,如果你想避免满值复制

+0

我该如何填充地图? – DHines

+0

使用运算符[]或插入方法 – gerrytan

+0

这是我试过的,不知道我是否以正确的方式去解决这个问题... class extStat { public: \t int fileCount_; \t int fileSize_; }; void scan(path f) { \t extStat ext; \t map map; \t cout <<“Scanning =”<< system_complete(f)<< endl; \t directory_iterator d(f); \t directory_iterator e; (; d!= e; ++ d) \t \t { \t \t path p = d-> path(); \t \t int temp = file_size(p); \t \t ext.fileCount _ ++; \t \t ext.fileSize_ + = temp; \t \t map [extension(p)] ext; \t} } – DHines

0

您也可以使用多图

map<string, size_t> fileExtSizeMap; 

简单的添加对遇到的每一个文件的新条目。

std :: lower_bound和std :: upperbound可用于搜索此结构。在生成的迭代器上使用std :: distance来获取文件数量。

或者只是遍历整个地图递增计数器,你去。