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。

4

3 回答 3

0

您还可以使用多地图

map<string, size_t> fileExtSizeMap;

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

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

或者简单地遍历完整的地图,在你去的时候增加一个计数器。

于 2013-03-30T21:44:40.640 回答
0

您可以创建一张地图:

 map<string, vector<int> > fileExtToSizeMap;

基本上,对于格式中的每个文件扩展名string,如果当前文件与该扩展名相关联,则将文件的大小放入 vectorvector<int>中。扫描完目录后,该向量的大小会告诉您,向量how many files are associated with the file extension的总和会告诉您the total size for each unique file extension。然后这个数据结构回答了你的两个主要问题。

于 2013-03-30T04:12:52.447 回答
0

我会创建一个数据结构,例如ExtensionStat

struct ExtensionStat {
  int totalFile;
  int totalSize;
};

并有一个从扩展名到统计的映射

map<string, ExtensionStat> extMap;

然后,您只需将收集统计信息的文件夹的内容迭代到extMap. 请记住,您不需要使用结构,也可以使用类。map<string, ExtensionStat*> extMap;如果您想避免全值复制,您也可以选择要使用的地图

于 2013-03-30T04:12:59.780 回答