我正在尝试开发一个小型搜索引擎应用程序,以通过输入其名称作为输入来在我的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
}
// ...
}
答案 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。