Programmierung Verzeichnisse
Willemers Informatik-Ecke
In älteren Versionen von UNIX wurden die Verzeichnisaufrufe noch durch normale Dateioperationen realisiert, die die Datenstruktur der Verzeichniseinträge manipulierte. Diese Methode wird heute allerdings nicht mehr unterstützt.

Auslesen: opendir, readdir, closedir

Auslesen läuft analog zum Lesen einer Datei

Um ein Verzeichnis auszulesen, wird es zunächst geöffnet (opendir), dann werden die Einträge gelesen (readdir) und schließlich wird es geschlossen (closedir). Analog zum Dateihandle gibt es ein Verzeichnishandle, das vom Typ ein Zeiger auf DIR ist. Informationen über den Eintrag liefert die von readdir gelieferte Struktur dirent.

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name); 
struct dirent *readdir(DIR *dir);
int closedir(DIR *dir);

opendir()

Die Funktion opendir() erhält als Parameter den Namen des Verzeichnisses. Der Rückgabewert ist ein Zeiger auf die Verzeichnisdatei, die im Sinne eines Handle behandelt wird. Ein Fehler wird dadurch angezeigt, dass dieser Zeiger den Wert 0 hat.

readdir()

Die Funktion readdir() liest den nächsten Eintrag im Verzeichnis und erhält als Rückgabewert einen Zeiger auf eine Struktur dirent. Dieser Zeiger ist nur bis zum nächsten readdir() gültig und hat folgende Struktur:

struct dirent {
    long            d_ino;  /* Inode Nummer */
    off_t           d_off;  /* Offset zum nächsten dirent */
    unsigned short  d_reclen;/* Länge dieses Eintrags */
    char            d_name[NAME_MAX+1]; /* Dateiname */
};

Für das Anwenderprogramm ist eigentlich nur der Name des Eintrags interessant. Will man mehr über diesen Eintrag erfahren, beispielsweise, ob es wieder ein Verzeichnis ist, so braucht man dazu andere Systemaufrufe wie die Funktion stat().

closedir()

Zuletzt wird das Verzeichnis mit closedir() wieder geschlossen. Ein Beispielprogramm für das Auslesen eines Verzeichnisses sieht so aus:

#include <sys/types.h>
#include <dirent.h>

int main(int argc, char **argv)
{
DIR *dirHandle;
struct dirent * dirEntry;

  dirHandle = opendir("."); /* oeffne aktuelles Verzeichnis */
  if (dirHandle) {
    while (0 != (dirEntry = readdir(dirHandle))) {
        puts(dirEntry->d_name);
    }
    closedir(dirHandle);
  }
}

Ermitteln des Arbeitsverzeichnisses

getcwd()

Die Funktion getcwd() ermittelt das aktuelle Arbeitsverzeichnis. Dazu hat das aufrufende Programm einen Puffer für den Namen zur Verfügung zu stellen, der groß genug ist. Die Größe wird als weiterer Parameter übergeben. Reicht dieser Speicher nicht aus, gibt getcwd() NULL zurück.

#include <unistd.h>

char * getcwd(char *namebuffer, size_t size);

In einigen Systemen ist es zulässig, eine 0 als Parameter für namebuffer zu übergeben. Dann alloziiert getcwd() selbst den benötigten Speicher und gibt den Zeiger darauf zurück. Dann muss die Anwendung durch einen Aufruf von free() dafür sorgen, dass der Speicher wieder zurückgegeben wird.

Die alte Funktion getwd() wird zwar teilweise noch unterstützt, sollte aber in neuen Anwendungen nicht mehr verwendet werden.

Wechseln: chdir

chdir()

Mit der Funktion chdir() wird das aktuelle Arbeitsverzeichnis gewechselt.

#include <unistd.h>

int chdir(char *Pfad);

Bei Erfolg gibt die Funktion 0, ansonsten -1 zurück. Die Fehlernummer findet sich in der Variablen errno.

Anlegen und Löschen: mkdir, rmdir

Die Funktionen zum Anlegen und Löschen der Verzeichnisse heißen wie die analogen Befehle. Beim Anlegen wird analog zum open() bei Dateien eine Berechtigungskennung übergeben. Wie das Kommando rmdir kann auch die Funktion nur leere Verzeichnisse löschen.

#include <fcntl.h>
#include <unistd.h>

int mkdir(char *Pfadname, mode_t mode);
int rmdir(char *Pfadname);

Bei Erfolg geben die Funktionen 0, ansonsten -1 zurück. Die Fehlernummer findet sich in der Variablen errno.

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing