在Windows平台上,C++/C中的Globbing

20

在Windows的C或C++中,是否有一种简便的方式进行glob匹配?

例如,运行myprogram.exe *.txt会向我的程序发送一个ARGV列表,其中包含... ARGV[1]=*.txt

我想要能够拥有一个函数(让我们称之为readglob),它接受一个字符串并返回一个字符串向量,每个字符串都包含一个文件名。

这样,如果我的目录中有文件a.txt b.txt c.txt,并且readglob得到一个参数*.txt,它将返回上面的文件列表。

//Prototype of this hypothetical function.
vector<string> readglob(string);

这样的存在吗?

5个回答

27

非常不跨平台,但它很容易使用且能正常工作。 - Paul Nathan
5
没必要跨平台,因为只有Win32存在这个问题!好建议。 - Greg Hewgill
2
刚刚我自己试了一下,效果非常好。再简单不过了。 - T.E.D.

4

这个方法非常与Windows相关,我不知道如何编写跨平台的代码。但是在Windows程序中我已经使用过它并且效果很好。

// Change to the specified working directory
string path;
cout << "Enter the path to report: ";
cin >> path;
_chdir(path.c_str());

// Get the file description
string desc;
cout << "Enter the file description: ";
cin >> desc;

// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
  do
  {
    cout << filedata.name << endl;
    // Or put the file name in a vector here
  } while (_findnext(file,&filedata) == 0);
}
else
{
  cout << "No described files found" << endl;
}
_findclose(file);

声明一个变量并将其初始化为5。Translated: 声明一个变量并将其初始化为5。 - Evan Teran
+1 给代码;我选择了 Michael 的答案,因为它更简单。 :-) - Paul Nathan
simple and useful. THX - Mr.Ly
1
请说明您代码所需的头文件,这将有助于解决问题。 - user1741137

2

曾经有人提议将其放在Boost::filesystem中,但最终选择使用boost::regex。

对于win32特定的(MFC),您可以使用CFileFind类。


真是太糟糕了。使用cl <myprogramname>进行快速测试并包含afx.h会导致与new相关的链接错误。感谢提供链接,但我不想在晚上花时间让MFC适应我的需求。 - Paul Nathan
似乎对于非MFC相关的内容,您可以使用FindFirstFile和类似函数来使用纯Win32代码完成。 - Evan Teran
MFC主要是Win32调用的包装器,我记不起FindFirstFile()了,现在一切都回来了。 - Martin Beckett

1

现在可能有更好的方法,但上次我处理这个问题时,我最终将Henry Spencer的正则表达式库静态链接到我的程序中(他的库是BSD许可证),然后我制作了一个包装类,将用户的glob表达式转换为正则表达式以供正则表达式代码使用。如果您愿意,可以在这里查看/获取包装类。

一旦您完成了这些部分,最后要做的事情就是实际读取目录,并将每个条目名称传递到匹配函数中,以查看它是否与表达式匹配。匹配的文件名将添加到您的向量中;不匹配的文件名将被丢弃。使用DOS _findfirst()和_findnext()函数相对简单地读取目录,但如果您想要更好的C++接口,我也有一个可移植的包装类...


0

额。大约15年前,我不得不在ANSI C中实现类似这样的东西。我想从ANSI opendir/readdir例程开始。通配符不完全是正则表达式,所以您将不得不实现自己的过滤。


根据https://dev59.com/ZkfRa4cB1Zd3GeqP-6Z3,opendir/readir不在Visual Studio中。 - Paul Nathan
该死!那些必须是POSIX,而不是ANSI。Win NT的POSIX层到底发生了什么??? - Roboprog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接