C ++如何将所有匹配“Folder \\ * .txt”的文件作为主要参数

时间:2017-02-01 10:15:45

标签: c++

我想使用匹配某些普通的glob作为主要参数的所有文件。

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

我该如何管理?

4 个答案:

答案 0 :(得分:0)

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

您应该将这两个参数放入主程序中,然后将它们削减。

#include <iostream>

int main(int argc, char** argv) {

    std::cout << argv[ 1 ] << ":  " << argv[ 2 ] << std::endl;
}  

<强>输入
program folder *.txt

<强>输出
folder: *.txt

现在您认为如何实施可以浏览目录中所有文件的算法,而不是找到匹配的一个

答案 1 :(得分:0)

关于此:Globbing in C++/C, on Windows 我已将setargv.obj链接到我的项目,它完全有效:

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:-1)

for %%a in (c:\x\*.txt) do my_prog %%a

这适用于直接命令行。如果您使用.BAT文件,请使用%a代替%%afor循环将找到所有文件,并为每个文件调用my_prog