微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 std::directoryIterator (c++) 跳过 !@Fharb、$Recycle.Bin Config.Msi、Recovery 等例如 systemFiles ?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。