跨平台“;标准;在C中接受带有通配符的文件名的方法?

跨平台“;标准;在C中接受带有通配符的文件名的方法?,c,cross-platform,arguments,wildcard,C,Cross Platform,Arguments,Wildcard,我正在用C编写一个命令行实用程序来处理图像文件。在当前状态下,应用程序可以通过argv接受多个显式文件名,但我想添加对通配符的支持,如下所示: imgprocess.exe *.png *.gif 或 看起来这应该是C99支持的足够普遍的事情,但我很难找到一个标准的、跨平台的解决方案 对于Windows,似乎(通过)链接到setargv.obj起到了作用,但这是特定于Windows的,我认为是Visual Studio 对于Linux,它看起来像或可以给我一个目录列表,我可以通过迭代来匹配文件

我正在用C编写一个命令行实用程序来处理图像文件。在当前状态下,应用程序可以通过
argv
接受多个显式文件名,但我想添加对通配符的支持,如下所示:

imgprocess.exe *.png *.gif

看起来这应该是C99支持的足够普遍的事情,但我很难找到一个标准的、跨平台的解决方案

对于Windows,似乎(通过)链接到
setargv.obj
起到了作用,但这是特定于Windows的,我认为是Visual Studio

对于Linux,它看起来像或可以给我一个目录列表,我可以通过迭代来匹配文件,但我认为这只是Linux

由于通配符是如此常见,我觉得我缺少了某种简单而明显的解决方案。目前,我正在使用gcc进行Linux编译,但我希望它至少能为Windows和Linux编译


谢谢您的建议。

在UNIX或类似UNIX的环境中处理此问题的正常方法是根本不处理它。也就是说,让shell进行全局扩展。您的程序只需要获得一个大的文件列表,根本不必担心在文件系统中查找。一个快速示例程序:

#include <stdio.h>

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

  for (i = 1; i < argc; i++)
  {
    printf("%s\n", argv[i]);
  }

  return 0;
}

在UNIX或类UNIX环境中处理此问题的正常方法是根本不处理它。也就是说,让shell进行全局扩展。您的程序只需要获得一个大的文件列表,根本不必担心在文件系统中查找。一个快速示例程序:

#include <stdio.h>

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

  for (i = 1; i < argc; i++)
  {
    printf("%s\n", argv[i]);
  }

  return 0;
}

至少在类似Linux的系统上,shell将通配符扩展为文件名列表。因此,没有必要添加此功能

至少在类似Linux的系统上,shell将通配符扩展为文件名列表。因此,没有必要添加此功能

POSIX系统确实支持
glob
globfree
函数(尝试
man 3 glob
,因为只要
man glob
就可以得到shell文档),它们与shell的glob行为做相同的事情

然而,正如其他人所说,您的程序将以这种方式处理参数的情况并不常见,也不期望如此:用户必须引用参数才能从命令行将其传递给您



如果你想真正跨平台,你可能想自己实现这个功能。假设使用PCRE(与Perl兼容的正则表达式库)作为基础,因为这在所有通用平台上都可用。

POSIX系统确实支持
glob
globfree
函数(尝试
man 3 glob
,因为只要
man glob
就可以获得shell文档)与shell的glob行为做相同的事情

然而,正如其他人所说,您的程序将以这种方式处理参数的情况并不常见,也不期望如此:用户必须引用参数才能从命令行将其传递给您


如果你想真正跨平台,你可能想自己实现这个功能。假设使用PCRE(与Perl兼容的正则表达式库)作为基础,因为这在所有通用平台上都可用

$ ./example 
$ ./example *
example
example.c
$ ./example *.c
example.c