C-Programm zum Auflisten von Verzeichnissen (ls-Nachbau) – Korrektur und Erklärung

Informatik4,75 KB

Verzeichnisinhalte mit C auflisten: Der ls-Befehl Schritt für Schritt

Das folgende C-Programm implementiert eine vereinfachte Version des Befehls ls. Es liest den Inhalt eines Verzeichnisses, ermittelt die Informationen zu jeder Datei und gibt sie je nach gewählten Optionen aus.

Definitionen und Konstanten

Zu Beginn werden die maximale Pfadlänge, die maximale Länge eines Dateinamens sowie die maximale Anzahl an Dateien festgelegt:

  • MAX_PATH 150
  • MAX_NOMBRE 32
  • MAX_FICHEROS 500

Die Struktur datosF

Die Struktur datosF speichert die Daten jeder Datei: Name, Größe, Inode, Benutzer, Gruppe und Berechtigungen.

struct datosF {
    char name[MAX_NOMBRE];
    long size;
    long inode;
    char *user;
    char *group;
    char permisos[10];
};

Funktion damePermisos

Die Funktion damePermisos wandelt den Datentyp mode_t in eine Zeichenkette mit den Berechtigungen um, etwa drwxr-xr-x. Dabei wird geprüft, ob es sich um ein Verzeichnis handelt, und für jede Berechtigung das entsprechende Zeichen gesetzt.

char *damePermisos(mode_t st_mode) {
    char *permiso = malloc(10);
    strcpy(permiso, "----------");
    if ((st_mode & S_IFDIR) == S_IFDIR) permiso[0] = 'd';
    if ((S_IRUSR & st_mode) == S_IRUSR) permiso[1] = 'r';
    if ((S_IWUSR & st_mode) == S_IWUSR) permiso[2] = 'w';
    if ((S_IXUSR & st_mode) == S_IXUSR) permiso[3] = 'x';
    if ((S_IRGRP & st_mode) == S_IRGRP) permiso[4] = 'r';
    if ((S_IWGRP & st_mode) == S_IWGRP) permiso[5] = 'w';
    if ((S_IXGRP & st_mode) == S_IXGRP) permiso[6] = 'x';
    if ((S_IROTH & st_mode) == S_IROTH) permiso[7] = 'r';
    if ((S_IWOTH & st_mode) == S_IWOTH) permiso[8] = 'w';
    if ((S_IXOTH & st_mode) == S_IXOTH) permiso[9] = 'x';
    return permiso;
}

Vergleichsfunktionen für qsort

Für die Sortierung werden mehrere Vergleichsfunktionen benötigt:

  • ordenaTamano_maM: Sortiert nach Größe, vom kleinsten zum größten Element.
  • ordenaTamano_Mam: Sortiert nach Größe, vom größten zum kleinsten Element.
  • ordenaNombre: Sortiert alphabetisch nach Name.
  • ordenaNombre_Inv: Sortiert alphabetisch nach Name in umgekehrter Reihenfolge.
int ordenaTamano_maM(const void *_a, const void *_b) {
    struct datosF a, b;
    a = *((struct datosF *)_a);
    b = *((struct datosF *)_b);
    return (a.size - b.size);
}

int ordenaTamano_Mam(const void *_a, const void *_b) {
    struct datosF a, b;
    a = *((struct datosF *)_a);
    b = *((struct datosF *)_b);
    return (b.size - a.size);
}

int ordenaNombre(const void *_a, const void *_b) {
    struct datosF a, b;
    a = *((struct datosF *)_a);
    b = *((struct datosF *)_b);
    return strcmp(a.name, b.name);
}

int ordenaNombre_Inv(const void *_a, const void *_b) {
    struct datosF a, b;
    a = *((struct datosF *)_a);
    b = *((struct datosF *)_b);
    return strcmp(b.name, a.name);
}

Die Funktion do_ls

Die Funktion do_ls ist das Herzstück des Programms. Sie führt folgende Schritte aus:

  1. Das Verzeichnis wird mit opendir geöffnet. Schlägt dies fehl, wird eine Fehlermeldung ausgegeben und das Programm beendet.
  2. Mit readdir werden die Einträge nacheinander gelesen. Für jeden Eintrag werden mit stat die Dateiinformationen ermittelt.
  3. Die Informationen werden im Array datosFichero gespeichert. Die Schleife endet, wenn keine Einträge mehr vorhanden sind oder die maximale Anzahl erreicht ist.
  4. Das Verzeichnis wird mit closedir geschlossen.
  5. Mit qsort werden die Daten je nach Option nach Größe oder Name sortiert, gegebenenfalls umgekehrt.
  6. Anschließend werden die Daten entsprechend den gewählten Optionen ausgegeben. Versteckte Dateien werden nur angezeigt, wenn die Option hidden aktiv ist.
  7. Ist die Option recursive gesetzt und der Eintrag ein Verzeichnis, ruft sich die Funktion für dieses Unterverzeichnis selbst auf.

Hinweise zur Korrektur

Der ursprüngliche Code enthielt zahlreiche Fehler, darunter fehlende Kommas und Semikolons, falsche Zuweisungen wie while ((infodir = NULL) statt != NULL, die Verwendung nicht deklarierter Variablen wie size statt infoBuffer.st_size sowie Tippfehler in Feldnamen wie tamano und nombre. Diese wurden korrigiert, ohne den Funktionsumfang zu verändern.

Herunterladen

PDF Word HTML