Men*_*des 2 c++ windows visual-studio-2010
我在 Linux 中有以下代码,用于查找与给定通配符匹配的文件:
\n\n std::vector<std::string> listFilenamesInPath(std::string wildcard = "*", std::string directory = "./")\n {\n std::vector<std::string> result;\n DIR* dirp = opendir(directory.c_str());\n\n if (dirp)\n {\n while (true)\n {\n struct dirent* de = readdir(dirp);\n\n if (de == NULL)\n break;\n\n if (fnmatch(wildcard.c_str(), de->d_name, 0))\n continue;\n else\n result.push_back (std::string(de->d_name));\n }\n\n closedir(dirp);\n }\n\n std::sort(result.begin(), result.end());\n\n return result;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n我\xc2\xb4m将此代码移植到Windows并发现fnmatch不可用(dirent也不可用,但我可以根据以下SO链接找到一个。
是否有一个 fnmatch 替代函数可以做完全相同的事情?
\n\n如何使这段代码在 VS2012 中编译并运行而不破坏我的逻辑?
\n感谢 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;
}
Run Code Online (Sandbox Code Playgroud)
如果有什么可以改进的地方请评论...
| 归档时间: |
|
| 查看次数: |
2356 次 |
| 最近记录: |