在Windows中使用C或C ++中的平滑方式吗?
例如,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);
这样的存在吗?
答案 0 :(得分:26)
与setargv.obj
(或wsetargv.obj
)和argv []的链接将为您提供全局内容,类似于Unix shell的操作方式:
我无法保证它的表现如何。
答案 1 :(得分:3)
这是特定于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);
答案 2 :(得分:2)
有关于在Boost :: filesystem中使用它的讨论,但它被弃用,转而使用boost :: regex。
对于特定于win32(MFC),您可以使用CFileFind类
答案 3 :(得分:1)
现在可能有更好的方法,但上次我不得不处理这个问题,我最终将Henry Spencer's regex library静态链接到我的程序中(他的库是BSD许可的),然后我做了一个包装类将用户的glob-expression转换为正则表达式以转换为正则表达式代码。如果您愿意,可以查看/获取包装类here。
一旦你有了这些部分,最后要做的就是读取目录,并将每个条目名称传递给匹配的函数,看它是否与表达式匹配。匹配的文件名,您添加到您的向量;你不丢弃的那些。使用DOS _findfirst()和_findnext()函数读取目录相当简单,但是如果你想要一个更好的C ++接口,我也有一个portable wrapper类...
答案 4 :(得分:0)
EHW。大约15年前,我不得不在ANSI C中实现类似的功能。我想,从ANSI opendir / readdir例程开始。 Globs不完全是RegEx,因此您必须实现自己的过滤。