gpt4 book ai didi

c++ - Windows fnmatch 替代品

转载 作者:可可西里 更新时间:2023-11-01 11:17:15 29 4
gpt4 key购买 nike

我在 Linux 中有以下代码,用于查找与给定通配符匹配的文件:

    std::vector<std::string> listFilenamesInPath(std::string wildcard = "*", std::string directory = "./")
{
std::vector<std::string> result;
DIR* dirp = opendir(directory.c_str());

if (dirp)
{
while (true)
{
struct dirent* de = readdir(dirp);

if (de == NULL)
break;

if (fnmatch(wildcard.c_str(), de->d_name, 0))
continue;
else
result.push_back (std::string(de->d_name));
}

closedir(dirp);
}

std::sort(result.begin(), result.end());

return result;
}

我将这段代码移植到 Windows 上,发现 fnmatch 不可用(dirent 也不可用,但我可以根据以下 SO link 找到一个.

是否有 fnmatch 替代函数做完全相同的事情?

如何在不破坏我的逻辑的情况下使这段代码在 VS2012 中编译和运行?

最佳答案

感谢 SergeyA 的帮助。这是我的最终解决方案,以防将来有人需要......

#ifdef _WIN32
#include "dirent.h"
#include "windows.h"
#include "shlwapi.h"
#else
#include <dirent.h>
#include <fnmatch.h>
#endif
std::vector<std::string> listFilenamesInPath(std::string wildcard = "*", std::string directory = "./")
{
std::vector<std::string> result;

DIR* dirp = opendir(directory.c_str());

if (dirp)
{
while (true)
{
struct dirent* de = readdir(dirp);

if (de == NULL)
break;

#ifdef _WIN32
wchar_t wname[1024];
wchar_t wmask[1024];

size_t outsize;
mbstowcs_s(&outsize, wname, de->d_name, strlen(de->d_name) + 1);
mbstowcs_s(&outsize, wmask, wildcard.c_str(), strlen(wildcard.c_str()) + 1);

if (PathMatchSpecW(wname, wmask))
result.push_back (std::string(de->d_name));
else
continue;
#else
if (fnmatch(wildcard.c_str(), de->d_name, 0))
continue;
else
result.push_back (std::string(de->d_name));
#endif
}

closedir(dirp);
}

std::sort(result.begin(), result.end());

return result;
}

如果有什么地方可以改进,请发表评论...

关于c++ - Windows fnmatch 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35877738/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com