827 Stimmen

Wie kann ich die Liste der Dateien in einem Verzeichnis mit C oder C++ erhalten?

Wie kann ich die Liste der Dateien in einem Verzeichnis in meinem C- oder C++-Code ermitteln?

Ich darf das Programm nicht ausführen. ls Befehl und analysiere die Ergebnisse in meinem Programm.

37voto

Chris Redford Punkte 15633

Ich empfehle die Verwendung von glob mit dieser wiederverwendbaren Verpackung. Er erzeugt eine vector<string> entsprechend den Dateipfaden, die dem Glob-Muster entsprechen:

#include <glob.h>
#include <vector>
using std::vector;

vector<string> globVector(const string& pattern){
    glob_t glob_result;
    glob(pattern.c_str(),GLOB_TILDE,NULL,&glob_result);
    vector<string> files;
    for(unsigned int i=0;i<glob_result.gl_pathc;++i){
        files.push_back(string(glob_result.gl_pathv[i]));
    }
    globfree(&glob_result);
    return files;
}

Diese kann dann mit einem normalen Systemplatzhaltermuster wie z.B.:

vector<string> files = globVector("./*");

34voto

Shrikant Punkte 704

Ich denke, das folgende Snippet kann verwendet werden, um alle Dateien aufzulisten.

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char** argv) { 
    list_dir("myFolderName");
    return EXIT_SUCCESS;
}  

static void list_dir(const char *path) {
    struct dirent *entry;
    DIR *dir = opendir(path);
    if (dir == NULL) {
        return;
    }

    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n",entry->d_name);
    }

    closedir(dir);
}

Dies ist die verwendete Struktur (vorhanden in dirent.h ) :

struct dirent {
    ino_t d_ino; /* inode number */
    off_t d_off; /* offset to the next dirent */
    unsigned short d_reclen; /* length of this record */
    unsigned char d_type; /* type of file */
    char d_name[256]; /* filename */
};

26voto

Meekohi Punkte 9811

Warum nicht glob() ?

#include <glob.h>

glob_t glob_result;
glob("/your_directory/*",GLOB_TILDE,NULL,&glob_result);
for(unsigned int i=0; i<glob_result.gl_pathc; ++i){
  cout << glob_result.gl_pathv[i] << endl;
}

26voto

Bad Punkte 4597

Hier ist ein sehr einfacher Code in C++11 mit boost::filesystem Bibliothek, um Dateinamen in einem Verzeichnis zu erhalten (ausgenommen Ordnernamen):

#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

int main()
{
    path p("D:/AnyFolder");
    for (auto i = directory_iterator(p); i != directory_iterator(); i++)
    {
        if (!is_directory(i->path())) //we eliminate directories
        {
            cout << i->path().filename().string() << endl;
        }
        else
            continue;
    }
}

Die Ausgabe ist wie:

file1.txt
file2.dat

11voto

Tim Punkte 19787

Versuchen Sie Boost für die x-Plattform-Methode

http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm

oder verwenden Sie einfach Ihr betriebssystemspezifisches Dateimaterial.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X