Ответ 1
Ссылка с setargv.obj
(или wsetargv.obj
) и argv [] будет зависеть от вас, подобно тому, как это делают оболочки Unix:
Я не могу ручаться за то, насколько хорошо он это делает.
Есть ли гладкий способ 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);
Есть ли такие?
Ссылка с setargv.obj
(или wsetargv.obj
) и argv [] будет зависеть от вас, подобно тому, как это делают оболочки Unix:
Я не могу ручаться за то, насколько хорошо он это делает.
Это очень специфично для 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);
был разговор о наличии его в Boost:: filesystem, но он был удален в пользу использования boost:: regex.
Для win32 specific (MFC) вы можете использовать класс CFileFind
Теперь может быть лучший способ, но в прошлый раз мне пришлось решить эту проблему, в итоге я включил библиотека регулярных выражений Генри Спенсера статически связанный с моей программой (его библиотека лицензирована BSD), а затем я создал класс-оболочку, который преобразовал пользовательские glob-выражения в регулярные выражения для подачи кода регулярного выражения. Вы можете просмотреть/захватить класс оболочки здесь, если хотите.
После того, как у вас есть эти части на месте, последнее, что нужно сделать, это фактически прочитать каталог и передать каждое имя записи в соответствующую функцию, чтобы увидеть, соответствует ли это выражению или нет. Имена файлов, которые соответствуют, вы добавляете к своему вектору; те, которые вы не отбрасываете. Чтение каталога довольно просто, используя функции DOS _findfirst() и _findnext(), но если вы хотите более удобный интерфейс на С++, у меня есть переносная обертка для этого также...
EHW. Я должен был реализовать что-то подобное в ANSI C около 15 лет назад. Начнем с подпрограмм ANSI opendir/readdir, я думаю. Globs не являются точно RegExs, поэтому вам придется реализовать свою собственную фильтрацию.