Глобус в С++/C, в Windows

Есть ли гладкий способ glob в C или С++ в Windows?

Например, myprogram.exe *.txt отправляет моей программе список ARGV, который имеет... ARGV [1] = *.txt в нем.

Я хотел бы иметь возможность иметь функцию (пусть ее называют readglob), которая берет строку и возвращает вектор строк, каждый из которых содержит имя файла.

Таким образом, если у меня есть файлы a.txt b.txt c.txt в моем каталоге, а readglob получает аргумент *.txt, он возвращает указанный выше список файлов.

//Prototype of this hypothetical function.
vector<string> readglob(string);

Есть ли такие?

Ответ 1

Ссылка с setargv.obj (или wsetargv.obj) и argv [] будет зависеть от вас, подобно тому, как это делают оболочки Unix:

Я не могу ручаться за то, насколько хорошо он это делает.

Ответ 2

Это очень специфично для Windows. Я не знаю, как вы бы назвали это кросс-платформенным. Но я использовал это в программах Windows, и это хорошо работает для меня.

// Change to the specified working directory
string path;
cout << "Enter the path to report: ";
cin >> path;
_chdir(path.c_str());

// Get the file description
string desc;
cout << "Enter the file description: ";
cin >> desc;

// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
  do
  {
    cout << filedata.name << endl;
    // Or put the file name in a vector here
  } while (_findnext(file,&filedata) == 0);
}
else
{
  cout << "No described files found" << endl;
}
_findclose(file);

Ответ 3

был разговор о наличии его в Boost:: filesystem, но он был удален в пользу использования boost:: regex.

Для win32 specific (MFC) вы можете использовать класс CFileFind

Ответ 4

Теперь может быть лучший способ, но в прошлый раз мне пришлось решить эту проблему, в итоге я включил библиотека регулярных выражений Генри Спенсера статически связанный с моей программой (его библиотека лицензирована BSD), а затем я создал класс-оболочку, который преобразовал пользовательские glob-выражения в регулярные выражения для подачи кода регулярного выражения. Вы можете просмотреть/захватить класс оболочки здесь, если хотите.

После того, как у вас есть эти части на месте, последнее, что нужно сделать, это фактически прочитать каталог и передать каждое имя записи в соответствующую функцию, чтобы увидеть, соответствует ли это выражению или нет. Имена файлов, которые соответствуют, вы добавляете к своему вектору; те, которые вы не отбрасываете. Чтение каталога довольно просто, используя функции DOS _findfirst() и _findnext(), но если вы хотите более удобный интерфейс на С++, у меня есть переносная обертка для этого также...

Ответ 5

EHW. Я должен был реализовать что-то подобное в ANSI C около 15 лет назад. Начнем с подпрограмм ANSI opendir/readdir, я думаю. Globs не являются точно RegExs, поэтому вам придется реализовать свою собственную фильтрацию.