函数来搜索目录中的文件名

C++ .find() function to search for file names in directory

本文关键字:文件名 搜索 函数      更新时间:2023-10-16

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

我收到这个建议是为了实现搜索功能。然而,它只允许我使用文件的确切名称进行搜索,例如"1234_0506AB.pdf">

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

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

我在这方面的经验很少,需要一些帮助和指导才能在代码中使用.find((或regex。

#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
}
// ...
}

要使用find,您应该查看该方法的文档,其中还包含大多数网站上的一些示例。

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

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();

有关使用正则表达式的解决方案,请查看同一网站上的正则表达式示例。