71 Stimmen

Wie erhält man einen Verzeichniseintrag in C?

Wie durchsucht man ein Verzeichnis nach Ordnern und Dateien in C? Es muss plattformübergreifend sein.

92voto

Clayton Punkte 5777

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.

23voto

Will Dean Punkte 38365

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:

http://c-faq.com/osdep/readdir.html

20voto

congusbongus Punkte 11902

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);

12voto

Andrew Grant Punkte 57342

Es gibt in C (oder C++) keinen Standardweg, um Dateien in einem Verzeichnis aufzuzählen.

Unter Windows können Sie die Funktionen FindFirstFile/FindNextFile verwenden, um alle Einträge in einem Verzeichnis aufzuzählen. Unter Linux/OSX verwenden Sie die Funktionen opendir/readdir/closedir.

9voto

Isak Savo Punkte 33709

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)

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