在Windows上用C ++ / C进行Globbing

有没有一种顺利的方式在C或C ++在Windows中的glob?

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

我想能够有一个函数(让我们称之为readglob)接受一个string,并返回一个string的向量,每个string包含一个文件名。

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

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

这是否存在?

setargv.obj (或wsetargv.obj )和argv []的链接将会为您类似于Unix shell如何执行:

我不能保证它做得如何。

这是非常特定于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); 

有关于它在Boost :: filesystem中的讨论,但它被放弃了使用boost :: regex。

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

现在可能有更好的办法,但是最后一次我不得不处理这个问题,结果包括亨利·斯宾塞的静态链接到我的程序(他的库是BSD许可) 的正则表达式库 ,然后我做了一个包装类,转换用户glob-expressions转换成正则表达式来馈给正则表达式代码。 如果你喜欢,你可以在这里查看/获取包装类。

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

硬件进化。 我不得不在15年前在ANSI C中实现这样的东西。 我想,从ANSI opendir / readdir例程开始。 Globs并不完全是RegEx,所以你将不得不实施你自己的过滤。