如何解决如何使用 std::directoryIterator (c++) 跳过 !@Fharb、$Recycle.Bin Config.Msi、Recovery 等例如 systemFiles ?
#include <filesystem>
#include <string>
for (const auto &pfile : std::directory_iterator(path))
{
// Get name and then,I wanna skip above subject files...
// (!@FHarb,$Recycle.Bin,Config.Msi,Recovery,Documents and Settings and so on such as system files)
auto name = pfile.path().filename().u8string();
}
我最近在 vs2017 中“std::filesystem::directory_iterator”
我想跳过上面的文件,但我发现的目录选项无效(无,请遵循目录符号链接)
解决方法
我想跳过上面的文件,但我发现的目录选项无效(无,请遵循目录符号链接)
当然,std::filesystem::directory_options
有不同的用途。引用 en.cppreference.com 中的文档:
此类型表示控制 directory_iterator 和 recursive_directory_iterator 行为的可用选项。
directory_options
满足 BitmaskType 的要求(即按位运算符 operator&
、operator|
、operator^
、operator~
、 operator&=
、operator|=
和 operator^=
是为此类型定义的)。 none 表示空位掩码;每隔一个枚举数代表一个不同的位掩码元素。
成员常量
+--------------------------+----------------------------------------------+
| Member constant | Meaning |
+--------------------------+----------------------------------------------+
| none (Default) | Skip directory symlinks,permission denied |
| | is error. |
+--------------------------+----------------------------------------------+
| follow_directory_symlink | Follow rather than skip directory symlinks. |
+--------------------------+----------------------------------------------+
| skip_permission_denied | Skip directories that would otherwise result |
| | in permission denied errors. |
+-----------------+-------------------------------------------------------+
那里'
s 没有考虑你在 C++ 标准文件系统概念中所谓的系统文件。
不过,您可以使用标准的 C++ 算法函数来轻松过滤 std::filesystem::directory_iterator
中的条目。只需执行以下操作:
#include <fstream>
#include <iostream>
#include <filesystem>
#include <algorithm>
namespace fs = std::filesystem;
template <typename pred>
fs::directory_iterator get_filtered_entries
(const fs::directory_iterator& dir_iter,pred pred_op) {
return std::find_if(fs::begin(dir_iter),fs::end(dir_iter),pred_op);
}
int main() {
fs::create_directories("sandbox/a/b");
std::ofstream("sandbox/file1.txt");
std::ofstream("sandbox/file2.txt");
auto dir_iter = fs::directory_iterator("sandbox");
auto filtered_entries = get_filtered_entries(dir_iter,// Place whatever predicate is appropriate to filter out specific entries
// from the directory
[](const fs::directory_entry& entry) {
return entry.path().string() == "sandbox/file1.txt"; });
std::for_each(fs::begin(filtered_entries),fs::end(filtered_entries),[](const fs::directory_entry& entry) { std::cout << entry.path() << '\n'; });
fs::remove_all("sandbox");
}
输出:
"sandbox/file1.txt"
"sandbox/a"
参见live demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。