webentwicklung-frage-antwort-db.com.de

Einfaches Glob in C++ auf Unix-System?

Ich möchte alle übereinstimmenden Pfade nach diesem Muster in einem vector<string> abrufen:

"/some/path/img*.png"

Wie kann ich das einfach machen?

26

Ich habe das in meinem Gist. Ich habe einen stl-Wrapper um glob erstellt, damit er den Vektor des Strings zurückgibt und sich um die Freigabe des glob-Ergebnisses kümmert. Nicht gerade sehr effizient, aber dieser Code ist etwas lesbarer und einige sagen, dass er einfacher zu verwenden ist.

#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;
}
48

Sie können die Bibliotheksfunktion glob() POSIX verwenden.

7
sth

Ich habe vor einiger Zeit, als ich gelangweilt war, eine einfache glob - Bibliothek für Windows & Linux geschrieben (funktioniert wahrscheinlich auch auf anderen * Nixen). Sie können sie nach Belieben verwenden.

Verwendungsbeispiel:

#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();
  }
}
6
szx

Ich habe die oben genannten Lösungen auf Centos6 ausprobiert und fand heraus, dass ich mich ändern musste:

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

(wobei "globerr" eine Fehlerbehandlungsfunktion ist)

Ohne die explizite 0 habe ich den Fehler "GLOB_NOSPACE" erhalten.

1
mousomer

Mostlikely http://www.boost.org/doc/libs/release/libs/regex/ ist der nächstgelegene, den Sie erhalten werden. Es besteht eine gute Chance, dass dies in C++ 11 unterstützt wird.

0
rakesh