Кроссплатформенный «стандартный» способ принимать имена файлов с подстановочными знаками в C? - PullRequest
1 голос
/ 03 июня 2011

Я пишу утилиту командной строки в C для обработки файлов изображений. В своем текущем состоянии приложение может принимать несколько явных имен файлов, хотя argv, но я хотел бы добавить поддержку подстановочных знаков, например:

imgprocess.exe *.png *.gif

или

./imgprocess *.png *.gif

Похоже, это должно быть достаточно распространенным явлением, чтобы его поддерживал C99, но мне очень трудно найти стандартное кроссплатформенное решение.

Для Windows, кажется (через эту статью ), что ссылка на setargv.obj делает свое дело, но это специфично для Windows, и я думаю, Visual Studio.

Для Linux это выглядит так: readdir() или scandir() может принести мне список каталогов, и я могу выполнить итерацию по нему для сопоставления файлов, но я думаю, что это просто Linux .

Поскольку подстановочные знаки - это обычное дело, я чувствую, что упускаю какое-то простое очевидное решение. В настоящее время я работаю над компиляцией Linux с помощью gcc, но мне бы хотелось, чтобы он компилировался как минимум для Windows и Linux.

Спасибо за любой совет.

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

В Linux-подобных системах, по крайней мере, оболочка расширяет подстановочный знак в список имен файлов. Поэтому нет необходимости добавлять эту функцию!

3 голосов
/ 03 июня 2011

Обычный способ решения этой проблемы в среде UNIX или UNIX-подобной ситуации - вообще не обрабатывать ее. То есть, пусть shell сделает расширение glob. Ваша программа просто получает большой список файлов, и ей вообще не нужно беспокоиться о просмотре файловой системы. Быстрый пример программы:

#include <stdio.h>

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

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

  return 0;
}

И несколько примеров прогонов (единственными файлами в каталоге являются example и example.c):

$ ./example 
$ ./example *
example
example.c
$ ./example *.c
example.c
0 голосов
/ 03 июня 2011

POSIX-системы поддерживают функции glob и globfree (попробуйте man 3 glob, потому что только man glob может получить документацию оболочки), которые делают то же самое, что и поведение оболочки.

Однако, как уже говорили другие, на самом деле ваша программа не будет обрабатывать аргументы таким образом, как это обычно бывает или ожидается: пользователь должен будет заключать аргументы в кавычки, чтобы передать их вам из строки комментария.


Если вы хотите быть действительно кроссплатформенным, вы можете реализовать эту функцию самостоятельно.Скажем, используя PCRE (Perl-совместимая библиотека регулярных выражений) в качестве основы, поскольку она доступна на всех распространенных платформах.

...