Globbing в C++/C, в Windows

Поскольку они - вещи, которые будут обычно происходить. Исключениями не являются механизмы потока управления. Пользователи часто понимают пароли превратно, это не исключительный случай. Исключениями должна быть действительно редкая вещь, UserHasDiedAtKeyboard ситуации с типом.

20
задан Paul Nathan 13 August 2009 в 00:42
поделиться

5 ответов

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

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

27
ответ дан 30 November 2019 в 00:23
поделиться

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

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

1
ответ дан 30 November 2019 в 00:23
поделиться

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

0
ответ дан 30 November 2019 в 00:23
поделиться

Это очень специфично для 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
ответ дан 30 November 2019 в 00:23
поделиться

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

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

2
ответ дан 30 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: