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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值