怎么写一个自动查询指定路径下文件数量然后依次读取的c++代码?

您所在的位置:网站首页 读取gho文件 怎么写一个自动查询指定路径下文件数量然后依次读取的c++代码?

怎么写一个自动查询指定路径下文件数量然后依次读取的c++代码?

#怎么写一个自动查询指定路径下文件数量然后依次读取的c++代码?| 来源: 网络整理| 查看: 265

谢邀 @嵌入式Linux内核

首先,我们需要封装一个类来处理这个任务。我们可以将这个类命名为FileReader。下面是一个初步的实现:

#include #include #include #include #include #include ​ namespace fs = std::filesystem; ​ class FileReader { public: enum class Mode { NORMAL, RECURSIVE }; ​ enum class SubdirectorySearch { SEQUENTIAL, PARALLEL }; ​ FileReader(Mode mode = Mode::NORMAL, SubdirectorySearch subSearch = SubdirectorySearch::SEQUENTIAL) : mode_(mode), subSearch_(subSearch), files_{} {} ​ std::map readFileData(const std::string& path) { if (mode_ == Mode::NORMAL) { readFileDataNormal(path); } else if (mode_ == Mode::RECURSIVE) { if (subSearch_ == SubdirectorySearch::SEQUENTIAL) { readFileDataRecursiveSequence(path); } else if (subSearch_ == SubdirectorySearch::PARALLEL) { readFileDataRecursiveParallel(path); } } ​ return files_; } ​ private: Mode mode_; SubdirectorySearch subSearch_; std::map files_; ​ void readFileDataNormal(const std::string& path) { for (auto& entry : fs::directory_iterator(path)) { if (entry.is_regular_file()) { auto filePath = entry.path().string(); auto extension = entry.path().extension().string(); if (files_.find(extension) == files_.end()) { files_[extension] = {}; } files_[extension].push_back(filePath); } } } ​ void readFileDataRecursiveSequence(const std::string& path) { std::vector entries; entries.push_back(fs::directory_entry(path)); ​ while (!entries.empty()) { auto entry = entries.back(); entries.pop_back(); ​ if (entry.is_directory()) { for (auto& subEntry : fs::directory_iterator(entry.path())) { entries.push_back(subEntry); } } else if (entry.is_regular_file()) { auto filePath = entry.path().string(); auto extension = entry.path().extension().string(); if (files_.find(extension) == files_.end()) { files_[extension] = {}; } files_[extension].push_back(filePath); } } } ​ void readFileDataRecursiveParallelHelper(const fs::directory_entry& entry) { if (entry.is_directory()) { std::vector entries; for (auto& subEntry : fs::directory_iterator(entry.path())) { entries.push_back(subEntry); } for (auto& subEntry : entries) { readFileDataRecursiveParallelHelper(subEntry); } } else if (entry.is_regular_file()) { auto filePath = entry.path().string(); auto extension = entry.path().extension().string(); if (files_.find(extension) == files_.end()) { files_[extension] = {}; } files_[extension].push_back(filePath); } } ​ void readFileDataRecursiveParallel(const std::string& path) { std::vector threads; for (auto& entry : fs::directory_iterator(path)) { threads.push_back(std::thread(&FileReader::readFileDataRecursiveParallelHelper, this, entry)); } for (auto& thread : threads) { thread.join(); } } };

这是一个比较完整的实现,可以满足你的需求。让我来解释一下。

首先,我们引入了几个库:

filesystem:提供了一个用于处理文件系统路径和文件的API。map:提供了一个键值对的数据结构。vector:提供了一个可变长度的数组。

然后,我们定义了一个FileReader类,它有几个属性:

mode_:表示文件读取的模式,可以是正常模式(即只读取指定路径下的文件)或递归模式(即读取指定路径下的所有文件,包括子目录下的文件)。subSearch_:表示并行查找子目录的方式,可以是顺序查找(即依次查找每个子目录)或并行查找(即同时查找所有子目录)。files_:用于存储读取到的文件信息。

FileReader还有一个readFileData函数,它接受一个文件路径并返回读取到的文件信息。该函数根据mode_和subSearch_的值,调用不同的函数来读取文件信息。最后,返回存储了文件信息的files_变量。

下面我们来看一下三个私有函数的实现。

首先是readFileDataNormal函数,它的作用是读取指定路径下的所有文件信息(不包括子目录)。它使用了directory_iterator来迭代指定目录下的所有文件,判断文件是否合法(即是否是普通文件),然后将文件的路径和扩展名存储在files_变量中。

接下来是readFileDataRecursiveSequence函数,它的作用是递归读取指定路径下的所有文件信息(包括子目录)。它使用了directory_iterator来迭代指定目录下的所有文件和子目录,对于每个文件,它判断是否是合法的文件,然后将文件的路径和扩展名存储在files_变量中。对于每个子目录,它将该目录的directory_entry存储在entries向量中,然后继续迭代下一个文件或子目录。

最后是readFileDataRecursiveParallel函数,它的作用和readFileDataRecursiveSequence相同,但是使用了多线程来并行处理子目录。它首先迭代指定目录下的所有文件和子目录,并为每个子目录创建一个新线程来调用readFileDataRecursiveParallelHelper函数(该函数和readFileDataRecursiveSequence的实现类似,不再赘述)。调用完成后,等待所有线程结束,然后返回存储了文件信息的files_变量。

个人建议参加零声教育的培训,学习效率会高很多,有目的性的参加培训,缩短周期,快速成型才是时代所需。Linux内核源码学习



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3