使用納入c++11
標準的regex
與納入c++17
標準的filesystem
模塊,可以實現快速遍歷指定文件夾內的特定文件(名字,類型)。
代碼實現
class FileSystem {
public:
~FileSystem() {
std::vector<std::string>().swap(__file_list);
};
public:
std::vector<std::string> recursive_visit(
const std::string _directory,
const std::string _parameter = ".*\.(bmp|jpg|png)$");
std::vector<std::string> non_recursive_visit(
const std::string _directory,
const std::string _parameter = ".*\.(bmp|jpg|png)$");
private:
FileSystem() = default;
private:
void __recursive_get_file_list();
void __non_recursive_get_file_list();
private:
std::string __directory;
std::string __parameter;
std::vector<std::string> __file_list;
private:
friend pattern::SingletonPattern<FileSystem>;
};
std::vector<std::string> FileSystem::recursive_visit(
const std::string _directory,
const std::string _parameter) {
if (_directory != __directory) {
__directory = _directory;
__parameter = _parameter;
__recursive_get_file_list();
}
return std::vector<std::string>(__file_list);
}
std::vector<std::string> FileSystem::non_recursive_visit(
const std::string _directory,
const std::string _parameter) {
if (_directory != __directory) {
__directory = _directory;
__parameter = _parameter;
__non_recursive_get_file_list();
}
return std::vector<std::string>(__file_list);
}
void FileSystem::__recursive_get_file_list() {
std::regex regex(__parameter);
std::vector<std::string>().swap(__file_list);
if (std::filesystem::is_directory(__directory)) {
for (auto ref : std::filesystem::recursive_directory_iterator(__directory)) {
if (std::regex_match(ref.path().filename().generic_string(), regex)) {
__file_list.push_back(ref.path().generic_string());
}
}
}
}
void FileSystem::__non_recursive_get_file_list() {
std::regex regex(__parameter);
std::vector<std::string>().swap(__file_list);
if (std::filesystem::is_directory(__directory)) {
for (auto ref : std::filesystem::directory_iterator(__directory)) {
if (std::regex_match(ref.path().filename().generic_string(), regex)) {
__file_list.push_back(ref.path().generic_string());
}
}
}
}
代碼說明
- 在我使用的場景中,因爲只需要一個文件系統的實例,所以我將
FileSystem
繼承自單例模板,並將其構造函數屬性設置成private
。 - 在我使用的場景中,文件路徑可能與文件名稱存在重複,在匹配正則表達式的時候,使用了不帶路徑的文件名
ref.path().filename().generic_string()
;我最終想得到的也是我指定格式的全路徑名稱,所以在保存名稱的地方使用ref.path().generic_string()
保存文件的全路徑。