在Windows上用C + / C中的Globbing

时间:2009-08-13 00:42:25

标签: c++ c windows glob

在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);

这样的存在吗?

5 个答案:

答案 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,因此您必须实现自己的过滤。