我正在尝试创建一个程序,在其中可以使用Visual Studio C ++在PC的目录中搜索某些文件。 由于我对此并不十分了解,因此我在另一个答案中找到了此代码(如下),但找不到该代码的任何解释。 我很难解决这个问题,将不胜感激。
如果还有另一种方法,我将很高兴知道如何做。 谢谢!
” 现在您可以获得文件名。只需比较文件名即可。
while ((dirp = readdir(dp)) != NULL) {
std::string fname = dirp->d_name;
if(fname.find("abc") != std::string::npos)
files.push_back(fname);
}
还可以使用scandir函数来注册过滤器功能。
static int filter(const struct dirent* dir_ent)
{
if (!strcmp(dir_ent->d_name, ".") || !strcmp(dir_ent->d_name, ".."))
return 0;
std::string fname = dir_ent->d_name;
if (fname.find("abc") == std::string::npos) return 0;
return 1;
}
int main()
{
struct dirent **namelist;
std::vector<std::string> v;
std::vector<std::string>::iterator it;
n = scandir( dir_path , &namelist, *filter, alphasort );
for (int i=0; i<n; i++) {
std::string fname = namelist[i]->d_name;
v.push_back(fname);
free(namelist[i]);
}
free(namelist);
return 0;
}
”
答案 0 :(得分:0)
这两种方法都使用find
的{{1}}函数:
std::string
这会在 fname.find("abc")
字符串中寻找"abc"
。如果找到,它将返回从其开始的索引,否则它将重新运行fname
,因此它们都将检查该子字符串。
您可能想使用std::string::npos
来查看是否完全匹配 。这取决于。
如果找到合适的文件名,则将其推回向量中。 您的主要功能有
==
它不使用。 我怀疑那是带有一些复制/粘贴的。
您可以使用基于范围的std::vector<std::string>::iterator it;
循环来查看向量中的内容:
for
for(const std::string & name : v)
{
std::cout << name << '\n';
}
函数还会检查filter
和"."
,因为它们具有特殊含义-当前目录和上一个目录。
那时,C API已返回".."
,因此它们使用char *
而不是std :: string方法。
编辑:
strcmp
使用尚未声明的n = scandir( dir_path , &namelist, *filter, alphasort );
。
试试
n
此外,它使用int n = scandir( dir_path , &namelist, *filter, alphasort );
,需要在某处声明。
要快速修复,请尝试
dir_path
(或您想要的任何路径,提防带有额外的反斜杠的转义反斜杠。
您可能希望将其作为const char * dir_path = "C:\\";
传递给main。
答案 1 :(得分:0)
执行此操作的更好方法可能是使用新的std::filesystem
library。 directory_iterators
允许您浏览目录的内容。由于它们只是迭代器,因此您可以将它们与标准算法(例如std::find_if
)组合以搜索特定条目:
#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
}
// ...
}
我们首先为要搜索的目录创建一个directory_iterator
d
。然后,我们使用std::find_if()
浏览目录的内容并搜索与我们要查找的文件名匹配的条目。 std::find_if()
期望将函数对象作为最后一个参数,该参数将应用于每个访问的元素,并且如果元素与我们要查找的内容匹配,则返回true
。 std::find_if()
将迭代器返回到该谓词函数为其返回true
的第一个元素,否则返回结束迭代器。在这里,我们使用一个lambda作为谓词,当我们正在查看的目录条目的路径的文件名部分与所需的文件名匹配时,它返回true
。然后,我们将std::find_if()
返回的迭代器与结束迭代器进行比较,以查看是否找到了条目。如果确实找到了一个条目,则*found
将得出代表各自文件系统对象的directory_entry
。
请注意,这将需要最新版本的Visual Studio2017。不要忘记在项目属性(C ++ / Language)中将语言标准设置为/std:c++17
或/std:c++latest
。