Wie bekommt man einen Verzeichniseintrag in C?

Lesezeit: 4 Minuten

andrewrks Benutzeravatar
andrewrk

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

Claytons Benutzeravatar
Clayton

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)) != NULL)
      puts (ep->d_name);
          
    (void) closedir (dp);
    return 0;
  }
  else
  {
    perror ("Couldn't open the directory");
    return -1;
  }
}

Anerkennung: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html

Getestet unter Ubuntu 16.04.

  • Was ist damit: error: unknown type name 'off64_t'

    – Tomáš Zato – Wiedereinsetzung von Monica

    13. Mai 2014 um 11:12 Uhr

  • Ich musste die ändern while Zustand zu (ep = readdir(dp)) != NULL)

    – jds

    8. Januar 2015 um 4:59 Uhr

  • @Clayton – was ist, wenn ich nur die TXT-Dateien drucken möchte?

    – Jimo

    13. Mai 2015 um 13:17 Uhr

  • Für Windows benötigen Sie möglicherweise die Win32-Implementierung von dirent.h: github.com/tronkko/dirent . Ändern Sie einfach in “dirent.h”

    – bot1131357

    11. Dezember 2016 um 23:20 Uhr

Benutzeravatar von Will Dean
Will Dekan

Die strenge Antwort lautet “Sie können nicht”, da das eigentliche Konzept eines Ordners nicht wirklich plattformübergreifend ist.

Auf MS-Plattformen können Sie _findfirst, _findnext und _findclose für ein „c“-Feeling und FindFirstFile und FindNextFile für die zugrunde liegenden Win32-Aufrufe verwenden.

Hier ist die C-FAQ-Antwort:

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

  • Gibt es irgendwo bereits einen Alias ​​für _findfirst, _findnext und _findclose? nicht in windows.h richtig?

    – BuddyJoe

    14. August 2012 um 13:12 Uhr

Ich habe einen Open Source (BSD) C-Header erstellt, der sich mit diesem Problem befasst. Es unterstützt derzeit POSIX und Windows. Bitte schau es dir an:

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("https://stackoverflow.com/");
    }
    printf("\n");

    tinydir_next(&dir);
}

tinydir_close(&dir);

  • Wie hilft dies mehr als die ursprünglichen systemabhängigen Implementierungen? Oder ist es so, dass Sie nur eine benannte Bibliothek für Windows und POSIX benötigen?

    – kevr

    8. November 2016 um 1:40 Uhr

  • @kevr: tinydir.h ist ein Riese #ifdef Lösung in einer praktischen Header-Datei.

    – Josua

    23. Mai 2019 um 1:42 Uhr

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

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

GLib ist eine Portabilitäts-/Utility-Bibliothek für C, die die Grundlage des grafischen GTK+-Toolkits bildet. Es kann als eigenständige Bibliothek verwendet werden.

Es enthält portable Wrapper zum Verwalten von Verzeichnissen. Sehen Dienstprogramme für Glib-Dateien Dokumentation für Details.

Ich persönlich würde nicht einmal daran denken, große Mengen an C-Code zu schreiben, ohne so etwas wie GLib hinter mir zu haben. Portabilität ist eine Sache, aber es ist auch schön, Datenstrukturen, Thread-Helfer, Ereignisse, Hauptschleifen usw. kostenlos zu bekommen

Jikes, ich klinge fast wie ein Verkäufer 🙂 (keine Sorge, glib ist Open Source (LGPL) und ich bin in keiner Weise damit verbunden)

Benutzeravatar von Jonathan Leffler
Jonathan Leffler

opendir/readdir sind POSIX. Wenn POSIX für die gewünschte Portabilität nicht ausreicht, überprüfen Sie dies Apache Portable Runtime

Benutzeravatar von Pascal
Paskal

Die Verzeichnisliste variiert stark je nach Betriebssystem/Plattform. Dies liegt daran, dass verschiedene Betriebssysteme ihre eigenen internen Systemaufrufe verwenden, um dies zu erreichen.

Eine Lösung für dieses Problem wäre, nach einer Bibliothek zu suchen, die dieses Problem maskiert und portabel ist. Leider gibt es keine Lösung, die auf allen Plattformen einwandfrei funktioniert.

Auf POSIX-kompatiblen Systemen können Sie die Bibliothek verwenden, um dies zu erreichen, indem Sie den von Clayton veröffentlichten Code verwenden (auf den ursprünglich aus dem Buch Advanced Programming under UNIX von W. Richard Stevens verwiesen wird). Diese Lösung funktioniert unter *NIX-Systemen und würde auch unter Windows funktionieren, wenn Sie Cygwin installiert haben.

Alternativ könnten Sie einen Code schreiben, um das zugrunde liegende Betriebssystem zu erkennen, und dann die entsprechende Verzeichnisauflistungsfunktion aufrufen, die die „richtige“ Methode zum Auflisten der Verzeichnisstruktur unter diesem Betriebssystem enthält.

1416120cookie-checkWie bekommt man einen Verzeichniseintrag in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy