在Windows上使用MinGW进行Globbing

10

我有一个使用MinGW C++编译器构建的应用程序,类似于grep - 命令的工作方式如下:

myapp -e '.*' *.txt

使用-e开关后面的东西是一个正则表达式,紧接着是文件名模式。看起来MinGW会自动扩展(在UNIX术语中称为glob),所以我的正则表达式会被改变。我发现可以通过将全局变量_CRT_glob设置为零来关闭这种行为。对于Bash和其他明智的shell用户来说,这样做就可以了,因为shell会扩展文件模式。但是,对于MS cmd.exe用户来说,看起来我需要自己扩展文件模式。

所以我的问题是 - 有没有人知道一个globbing库(或者MinGW的功能)来进行部分命令行扩展?我知道Windows CRT的_setargv特性,但它是扩展整个命令行。请注意,我看过这个问题,但它真的没有解决部分扩展的问题。

最终,我用条件编译编写了自己的Windows应用程序版本的globbing代码。这很容易,因为我有自己的CommandLine类,它封装了main()中的argc和argv。但我很想听听其他解决方案。


1
奇怪的是,在正则表达式周围加上引号应该可以防止通配符行为。 - Brian Neal
1
@Brian 它防止了 shell(比如 bash)进行 globbing,但是 bash 会去掉引号并将其传递给我的应用程序,然后再进行另一轮的 globbing。 - anon
1
我想我不明白。如果你的应用程序在argc/argv中得到了.*,那么问题是什么? - Brian Neal
@Brian 应用程序获取 .*,在进入 main() 函数之前自动将其扩展为文件规范,因此我的代码看不到 .*,而是看到文件名列表。 - anon
2个回答

2

<glob.h> 包含 globglobfree 函数以及许多用于 glob 的标志。


4
很遗憾,它不是MinGW的一部分。 - anon
1
现在看来,glob.h 已经成为 MinGW 的一部分了。 - Qix - MONICA WAS MISTREATED

0

我不确定我是否完全理解您的问题,但在Windows中,您应该能够使用WIN32 API中的FindFirstFile / FindNextFile函数进行glob操作。老实说,我不知道它们的globing功能是否与glob()相当,但您可以尝试一下。


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