c++ new feature : filesystem

使用納入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());
			}
		}
	}
}

代碼說明

  1. 在我使用的場景中,因爲只需要一個文件系統的實例,所以我將FileSystem繼承自單例模板,並將其構造函數屬性設置成private
  2. 在我使用的場景中,文件路徑可能與文件名稱存在重複,在匹配正則表達式的時候,使用了不帶路徑的文件名ref.path().filename().generic_string();我最終想得到的也是我指定格式的全路徑名稱,所以在保存名稱的地方使用ref.path().generic_string()保存文件的全路徑。

參考

正則表達式:regex
文件系統:filesystem

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章