C ++ .find()函数可在目录

时间:2018-07-19 13:07:17

标签: c++ visual-studio search directory filesystems

我正在尝试开发一个小型搜索引擎应用程序,以通过输入其名称作为输入来在我的C://目录中搜索本地文件。

我收到了这个建议,作为对搜索功能的一种实现。但是,它只允许我搜索文件的确切名称,例如“ 1234_0506AB.pdf”

我希望我的搜索功能将“ 1234”作为输入,并且仍然能够获取“ 1234_0506AB.pdf”。

另一个建议是:与其简单地通过dir_entry.path().filename() == file_name测试相等性,不如将文件名作为字符串dir_entry.path().filename().string()并执行.find()。对于更一般的搜索,您可以使用 regex 并将其与文件名匹配。

我对此经验很少,需要一些帮助和指导才能在我的代码中使用.find()或正则表达式。

#include <filesystem>
#include <algorithm>

namespace fs = std::filesystem;

void search(const fs::path& directory, const fs::path& file_name)
{
    auto d = fs::directory_iterator(directory);

    auto found = std::find_if(d, end(d), [&file_name](const auto& dir_entry)
    {
        return dir_entry.path().filename() == file_name;
    });

    if (found != end(d))
    {
        // we have found what we were looking for
    }

    // ...
}

1 个答案:

答案 0 :(得分:4)

要使用查找,您应该检查documentation of the method,其中还包含大多数网站上的一些示例。

在您的代码中,如果文件名与要查找的文件名完全相同,则您接受该文件名:

return dir_entry.path().filename() == file_name;

要接受子字符串匹配,您必须修改此检查以使用find而不是==。如链接文档中所述,find如果找不到匹配项,则会返回npos

return dir_entry.path().filename().string().find(file_name.string()) != std::string::npos;

如果仅在字符串的开头查找匹配项,则可以使用== 0代替!= npos

但是在这种情况下,您还有其他选择,例如使用substr将文件名剪切为所需的长度:

return dir_entry.path().filename().string().substr(0, file_name.size()) == file_name.string();

有关使用正则表达式的解决方案,请在同一站点上检查regex examples