【问题标题】:C++ How to take all files matching "Folder\\*.txt" as a main argumentC ++如何将所有匹配“文件夹\\ * .txt”的文件作为主要参数
【发布时间】:2017-06-18 01:00:03
【问题描述】:

我想使用所有匹配一些琐碎 glob 的文件作为主要参数。

例如,如果我需要浏览文件夹“X”中的所有 txt 文件,我想在命令提示符中启动我的程序,例如 my_prog C:\X\*.txt

我该如何管理?

【问题讨论】:

  • 这不是正则表达式,而是全局。您的文件系统或操作系统以及您的 shell 应该提供通配符功能。
  • 谢谢你们。现在我知道用谷歌搜索什么了。

标签: c++


【解决方案1】:
for %%a in (c:\x\*.txt) do my_prog %%a

这是直接命令行。如果您使用 .BAT 文件,请使用 %a 而不是 %%afor 循环将查找所有文件并为每个文件调用 my_prog

【讨论】:

    【解决方案2】:

    您在示例中使用的星号 * 不是您的程序的一部分。
    OS 有责任管理它!这将是一个WildCard
    事实上,您想在代码中使用 2 参数。一个用于path,另一个用于正则表达式

    您应该将这 2 个参数带入您的主程序,然后将它们配对。

    #include <iostream>
    
    int main(int argc, char** argv) {
    
        std::cout << argv[ 1 ] << ":  " << argv[ 2 ] << std::endl;
    }  
    

    输入
    program folder *.txt

    输出
    folder: *.txt

    现在你的意见是如何实现可以遍历目录中所有文件的算法,而不是找到匹配的一个

    【讨论】:

    • 我更喜欢使用setargv.obj 的方法,因为现在我不应该考虑我有多少论据。我可以做类似Folder1\*.txt Folder2\*.txt 的事情,而且效果很好。
    【解决方案3】:

    关于这个:Globbing in C++/C, on Windows 我已将 setargv.obj 链接到我的项目,并且效果很好:

    for (int i = 1; i < argc; i++) {
            std::cout << argv[i] << '\n';
    }
    

    【讨论】:

      【解决方案4】:

      在 C++17 中,有一个新的标准 &lt;filesystem&gt; 库,可帮助以可移植的方式为 Unix 风格和 Windows 风格的操作系统操作路径和文件名。

      Unix shell 通常在启动进程之前代表程序执行 globbing,因此程序只需在参数向量中接收匹配文件的列表。这里的权衡是,如果您想在命令行上使用任何这些特殊字符(例如,传递实际的正则表达式),用户必须知道对特定 shell 使用正确的转义规则。

      Windows(和其他操作系统,如 VMS)提供程序可以调用的 API,以将通配符文件规范转换为实际文件名。在 Windows 中执行此操作的传统方法是使用 FindFirstFileFindNextFile。这里的权衡是人们经常弄乱使用这个 API 遍历文件的代码。错误的方法有很多种。

      C++17 &lt;filesystem&gt; 库提供了目录迭代器(常规和递归),它们应该抽象出正确使用操作系统 API 的许多细节。

      【讨论】:

        猜你喜欢
        • 2016-10-01
        • 2016-12-17
        • 2016-02-26
        • 2019-11-01
        • 2020-04-17
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多