【问题标题】:Globbing with MinGW on Windows在 Windows 上使用 MinGW 进行通配
【发布时间】:2011-02-26 09:59:56
【问题描述】:

我有一个使用 MinGW C++ 编译器构建的应用程序,它的工作原理类似于 grep - 命令看起来像这样:

myapp -e '.*' *.txt

-e 开关后面的东西是正则表达式,后面的东西是文件名模式。似乎 MinGW 会自动扩展(在 UNIX 术语中为 glob)命令行,所以我的正则表达式被破坏了。我发现,我可以通过将全局变量 _CRT_glob 设置为零来关闭此行为。这对于 bash 和其他明智的 shell 用户来说会很好,因为 shell 会扩展文件模式。但是,对于 MS cmd.exe 用户,看来我必须自己扩展文件模式。

所以我的问题 - 有没有人知道一个通​​配库(或 MinGW 中的设施)来进行 部分 命令行扩展?我知道 Windows CRT 的 _setargv 功能,但这扩展了完整的命令行。请注意我见过this question,但它确实没有解决部分扩展问题。

我最终使用条件编译为我的应用程序的 Windows 版本编写了自己的通配符代码。这很简单,因为我有自己的命令行类,它封装了 main() 中的 argc 和 argv。不过,我很想知道其他解决方案。

【问题讨论】:

  • 奇怪,在你的正则表达式周围加上引号应该可以防止通配行为。
  • @Brian 它可以防止 shell 进行 globbing(比如 bash),但是 bash 会删除引号并将其传递给我的应用程序,然后我的应用程序会进行另一轮 globbing。
  • 我想我不会跟着。如果您的应用在 argc/argv 中获得 .*,那么问题出在哪里?
  • @Brian 应用程序获取 .* ,它会在输入 main() 之前自动扩展为文件规范,因此我自己的代码看不到 .* - 它会看到文件名列表。跨度>

标签: c++ windows command-line mingw


【解决方案1】:

<glob.h> 有 glob 和 globfree 以及很多 glob 的标志。

【讨论】:

  • 不幸的是,它不是 MinGW 的一部分。
  • glob.h 现在似乎是 MinGW 的一部分。
【解决方案2】:

我不确定我是否完全理解您的问题,但在 Windows 中,您应该能够使用 WIN32 API 中的 FindFirstFile / FindNextFile 函数进行 glob。老实说,我不知道他们的全球定位能力是否与 glob() 相媲美,但你可以试一试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多