【发布时间】:2018-03-30 03:35:39
【问题描述】:
背景:一些 Windows 命令行程序允许在其第一个参数中使用 *.*:
myprogram *.*
并将自动循环目录的所有文件。
其他一些则不需要,因此需要批处理循环:
for %%c in ("*.*") do myprogram "%%c"
问题:是否有标准的方式(用C语言定义或由OS提供?)允许*.*或*.txt在参数中,以便自动对相关文件进行处理?
int main(int argc, char *argv[])
{
FILE *kf;
"for fname in argv[1]" // pseudo code here meaning:
// let's loop on all files described by the first argument
{
kf = fopen(fname, "rb");
...
}
}
我想在自己动手之前检查是否存在解决方案(重新发明通配符扩展的轮子,使用 FindFirstFile 等)
【问题讨论】:
-
AFAIK,自动循环 . 的程序,作为它们背后的代码。通过编写代码,您始终可以实现相同的行为
-
C 语言没有标准。参数扩展(如果有)由 shell 完成。通常 Unix/Linux shell 会进行扩展,但 Windows cmd 不会。因此,发生扩展的 Windows 程序自己执行此操作,它们接收例如
argv[1]中的“*.txt”,然后他们列出自己的目录并处理找到的每个文件。 -
您使用哪个编译器?该库可能包含为您执行此操作的方法。
-
docs.microsoft.com/en-us/cpp/cpp/wildcard-expansion 提供了一些信息和一个链接,说明如果您使用的是 MS Visual C++ 编译器,您可以如何做到这一点。对于 MinGW-w64,there appears to be an implementation-specific global variable
_dowildcard可能允许您这样做;我的猜测是它默认为 0,因为内部__setargv/__wsetargvfunction indll_argv.c将其设置为 1。 -
Windows 并不真正需要提供一种标准化的方式来执行 shell 文件名通配,因为它并不是一个具有强大命令行的系统。如果您想在 Windows 上获得更多类似 Unix 的 shell globbing,您可以使用 Cygwin 或 Windows 10 Linux 子系统 (WSL)。尽管正如其他人所指出的那样,C 在这方面没有实际的标准,但我建议在 Cygwin、WSL、Linux、BSD 等中可以依赖文件名扩展的行为有足够的共性。如果你是编写一个 GUI 应用程序,你可能根本不需要它。
标签: c windows filesystems wildcard filenames