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.
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.
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("./*");
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 */
};
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
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 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.