Простой глобус в С++ на unix-системе?
Я хочу получить все соответствующие пути, следующие за этим шаблоном, в vector<string>
:
"/some/path/img*.png"
Как я могу это сделать?
Ответы
Ответ 1
У меня это в моей сущности. Я создал stl-оболочку вокруг glob, чтобы вернуть вектор строки и позаботиться об освобождении результата glob. Не совсем очень эффективно, но ваш код выглядит более читаемым.
#include <glob.h>
#include <vector>
#include <string>
inline std::vector<std::string> glob(const std::string& pat){
using namespace std;
glob_t glob_result;
glob(pat.c_str(),GLOB_TILDE,NULL,&glob_result);
vector<string> ret;
for(unsigned int i=0;i<glob_result.gl_pathc;++i){
ret.push_back(string(glob_result.gl_pathv[i]));
}
globfree(&glob_result);
return ret;
}
Ответ 2
Вы можете использовать функцию glob()
POSIX.
Ответ 3
Я написал простую библиотеку glob для Windows и Linux (возможно, работает и на других * nixes) некоторое время назад, когда я был скучно, не стесняйтесь использовать его, как вам нравится.
Пример использования:
#include <iostream>
#include "glob.h"
int main(int argc, char **argv) {
glob::Glob glob(argv[1]);
while (glob) {
std::cout << glob.GetFileName() << std::endl;
glob.Next();
}
}
Ответ 4
Я пробовал решения выше на Centos6, и я узнал, что мне нужно изменить:
int ret = glob(pat.c_str(), 0, globerr, &glob_result);
(где "globerr" - это функция обработки ошибок)
Без явного 0 я получил ошибку "GLOB_NOSPACE".
Ответ 5
Вряд ли http://www.boost.org/doc/libs/release/libs/regex/ является самым близким, которое вы получите. Есть хороший шанс, что это будет поддерживаться в С++ 11.