Wie durchsucht man ein Verzeichnis nach Ordnern und Dateien in C? Es muss plattformübergreifend sein.
Antworten
Zu viele Anzeigen?Das folgende POSIX-Programm gibt die Namen der Dateien im aktuellen Verzeichnis aus:
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main (void)
{
DIR *dp;
struct dirent *ep;
dp = opendir ("./");
if (dp != NULL)
{
while (ep = readdir (dp))
puts (ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
Kredit: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html
Getestet unter Ubuntu 16.04.
Die eindeutige Antwort lautet "Nein", da das Konzept eines Ordners nicht wirklich plattformübergreifend ist.
Auf MS-Plattformen können Sie _findfirst, _findnext und _findclose für eine Art "c" verwenden, und FindFirstFile und FindNextFile für die zugrunde liegenden Win32-Aufrufe.
Hier ist die Antwort auf die C-FAQ:
Ich habe einen quelloffenen (BSD) C-Header erstellt, der sich mit diesem Problem befasst. Er unterstützt derzeit POSIX und Windows. Bitte probieren Sie es aus:
https://github.com/cxong/tinydir
tinydir_dir dir;
tinydir_open(&dir, "/path/to/dir");
while (dir.has_next)
{
tinydir_file file;
tinydir_readfile(&dir, &file);
printf("%s", file.name);
if (file.is_dir)
{
printf("/");
}
printf("\n");
tinydir_next(&dir);
}
tinydir_close(&dir);
GLib ist eine Portabilitäts-/Hilfsbibliothek für C, die die Grundlage für das grafische Toolkit GTK+ bildet. Sie kann als eigenständige Bibliothek verwendet werden.
Es enthält portable Wrapper für die Verwaltung von Verzeichnissen. Siehe Glib File Utilities Dokumentation für Details.
Ich persönlich würde es nicht einmal in Erwägung ziehen, große Mengen an C-Code zu schreiben, ohne etwas wie GLib im Rücken zu haben. Portabilität ist eine Sache, aber es ist auch schön, Datenstrukturen, Thread-Helfer, Ereignisse, Hauptschleifen usw. umsonst zu bekommen.
Huch, ich fange fast an, wie ein Verkäufer zu klingen :) (keine Sorge, glib ist Open Source (LGPL) und ich bin in keiner Weise damit verbunden)
- See previous answers
- Weitere Antworten anzeigen