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.

9voto

robertvarga Punkte 91

Sehen Sie sich diese Klasse an, die die Win32-Api verwendet. Konstruieren Sie einfach eine Instanz, indem Sie die foldername von dem Sie die Auflistung wünschen, rufen Sie dann die getNextFile Methode, um die nächste filename aus dem Verzeichnis. Ich denke, es braucht windows.h et stdio.h .

class FileGetter{
    WIN32_FIND_DATAA found; 
    HANDLE hfind;
    char folderstar[255];       
    int chk;

public:
    FileGetter(char* folder){       
        sprintf(folderstar,"%s\\*.*",folder);
        hfind = FindFirstFileA(folderstar,&found);
        //skip .
        FindNextFileA(hfind,&found);        
    }

    int getNextFile(char* fname){
        //skips .. when called for the first time
        chk=FindNextFileA(hfind,&found);
        if (chk)
            strcpy(fname, found.cFileName);     
        return chk;
    }

};

6voto

Homer6 Punkte 14461

GNU-Handbuch FTW

http://www.gnu.org/software/libc/manual/html_node/Simple-Directory-Lister.html#Simple-Directory-Lister

Außerdem ist es manchmal gut, direkt zur Quelle zu gehen (Wortspiel beabsichtigt). Man kann eine Menge lernen, wenn man sich das Innenleben einiger der gängigsten Befehle in Linux ansieht. Ich habe einen einfachen Spiegel von GNU's coreutils auf github eingerichtet (zum Lesen).

https://github.com/homer6/gnu_coreutils/blob/master/src/ls.c

Dies betrifft vielleicht nicht Windows, aber eine Reihe von Fällen, in denen Unix-Varianten verwendet werden, lassen sich mit diesen Methoden lösen.

Ich hoffe, das hilft...

6voto

3ashry Punkte 33
#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main() {
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

6voto

Venkat Vinay Punkte 89

Die Antwort von Shreevardhan ist sehr gut. Aber wenn Sie es in C++14 verwenden möchten, nehmen Sie einfach eine Änderung vor namespace fs = experimental::filesystem;

d.h.,

#include <string>
#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = experimental::filesystem;

int main()
{
    string path = "C:\\splits\\";
    for (auto & p : fs::directory_iterator(path))
        cout << p << endl;
    int n;
    cin >> n;
}

4voto

JasonYen2205 Punkte 41
char **getKeys(char *data_dir, char* tablename, int *num_keys)
{
    char** arr = malloc(MAX_RECORDS_PER_TABLE*sizeof(char*));
int i = 0;
for (;i < MAX_RECORDS_PER_TABLE; i++)
    arr[i] = malloc( (MAX_KEY_LEN+1) * sizeof(char) );  

char *buf = (char *)malloc( (MAX_KEY_LEN+1)*sizeof(char) );
snprintf(buf, MAX_KEY_LEN+1, "%s/%s", data_dir, tablename);

DIR* tableDir = opendir(buf);
struct dirent* getInfo;

readdir(tableDir); // ignore '.'
readdir(tableDir); // ignore '..'

i = 0;
while(1)
{

    getInfo = readdir(tableDir);
    if (getInfo == 0)
        break;
    strcpy(arr[i++], getInfo->d_name);
}
*(num_keys) = i;
return arr;
}

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