このパターンに従うすべての一致するパスをvector<string>
で取得したい:
"/some/path/img*.png"
どうすれば簡単にできますか?
Gistにそれがあります。文字列のベクトルを返し、グロブの結果を解放するように、グロブの周りにstlラッパーを作成しました。それほど効率的ではありませんが、このコードは少し読みやすく、一部のコードは使いやすいと言えます。
#include <glob.h> // glob(), globfree()
#include <string.h> // memset()
#include <vector>
#include <stdexcept>
#include <string>
#include <sstream>
std::vector<std::string> 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<std::string>
vector<string> 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;
}
glob()
POSIXライブラリ関数を使用できます。
私はWindows&Linux用のシンプルな glob ライブラリを書いた(おそらく他の* nixでも動作する)少し前に退屈していたので、自由に使ってみてください。
使用例:
#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();
}
}
私はCentos6で上記のソリューションを試しましたが、変更する必要があることがわかりました。
int ret = glob(pat.c_str(), 0, globerr, &glob_result);
(「globerr」はエラー処理関数です)
明示的な0がないと、「GLOB_NOSPACE」エラーが発生しました。
たぶん http://www.boost.org/doc/libs/release/libs/regex/ が最も近い。これがC++ 11でサポートされる可能性は十分にあります。