C-Programm zum Auflisten von Verzeichnissen (ls-Nachbau) – Korrektur und Erklärung
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:
- Das Verzeichnis wird mit
opendirgeöffnet. Schlägt dies fehl, wird eine Fehlermeldung ausgegeben und das Programm beendet. - Mit
readdirwerden die Einträge nacheinander gelesen. Für jeden Eintrag werden mitstatdie Dateiinformationen ermittelt. - Die Informationen werden im Array
datosFicherogespeichert. Die Schleife endet, wenn keine Einträge mehr vorhanden sind oder die maximale Anzahl erreicht ist. - Das Verzeichnis wird mit
closedirgeschlossen. - Mit
qsortwerden die Daten je nach Option nach Größe oder Name sortiert, gegebenenfalls umgekehrt. - Anschließend werden die Daten entsprechend den gewählten Optionen ausgegeben. Versteckte Dateien werden nur angezeigt, wenn die Option hidden aktiv ist.
- 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.