Glob simples em C ++ no sistema unix?

Desejo recuperar todos os caminhos correspondentes seguindo esse padrão em um vector :

 "/some/path/img*.png" 

Como posso simplesmente fazer isso?

Eu tenho isso na minha essência. Eu criei um wrapper stl em torno de glob para que ele retorne vetor de string e cuide de liberar o resultado glob. Não é exatamente muito eficiente, mas esse código é um pouco mais legível e alguns diriam que é mais fácil de usar.

 #include  // glob(), globfree() #include  // memset() #include  #include  #include  #include  std::vector glob(const std::string& pattern) { using namespace std; // glob struct resides on the stack glob_t glob_result; memset(&glob_result, 0, sizeof(glob_result)); // do the glob operation int return_value = glob(pattern.c_str(), GLOB_TILDE, NULL, &glob_result); if(return_value != 0) { globfree(&glob_result); stringstream ss; ss << "glob() failed with return_value " << return_value << endl; throw std::runtime_error(ss.str()); } // collect all the filenames into a std::list vector filenames; for(size_t i = 0; i < glob_result.gl_pathc; ++i) { filenames.push_back(string(glob_result.gl_pathv[i])); } // cleanup globfree(&glob_result); // done return filenames; } 

Você pode usar a function de biblioteca POSIX glob() .

Eu escrevi uma biblioteca glob simples para Windows e Linux (provavelmente funciona também em outros * nixes) há um tempo atrás, quando eu estava entediado, sinta-se livre para usá-lo como quiser.

Exemplo de uso:

 #include  #include "glob.h" int main(int argc, char **argv) { glob::Glob glob(argv[1]); while (glob) { std::cout << glob.GetFileName() << std::endl; glob.Next(); } } 

Eu tentei as soluções acima no Centos6, e descobri que precisava mudar:

 int ret = glob(pat.c_str(), 0, globerr, &glob_result); 

(onde “globerr” é uma function de tratamento de erros)

Sem o 0 explícito, recebi o erro “GLOB_NOSPACE”.

Mais provavelmente http://www.boost.org/doc/libs/release/libs/regex/ é o mais próximo que você vai conseguir. Existe uma boa chance de que isso seja suportado no C ++ 11.