【问题标题】:*.* in argv[1] in C*.* 在 C 中的 argv[1] 中
【发布时间】: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/__wsetargv function in dll_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


【解决方案1】:

不,没有标准的方法可以做到这一点。必须在主函数中处理“.”。但是,可能有一些在主 C 库主体之外派生的库正在执行您需要执行的操作。此外,您可以编写一个批处理文件,该文件将遍历文件集并调用 C 编写的应用程序,如Windows Batch File Looping Through Directories to Process Files?中所述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2021-11-09
    • 2022-01-10
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多