2012-11-25 13 views
14

Als Teil einer Zuweisung von einem meiner Klassen implementieren, ich habe ein Programm in C schreiben, um die Ergebnisse des ls -al Befehl zu duplizieren. Ich habe die notwendigen Materialien gelesen, aber ich bekomme immer noch nicht die richtige Ausgabe. Hier ist mein Code so weit, seine nur angeblich aus der Dateigröße drucken und die Dateinamen, aber die Dateigrößen ihr Druck ist nicht korrekt.die ls -al Befehl in C

Code:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main(int argc, char* argv[]) 
{ 
    DIR *mydir; 
    struct dirent *myfile; 
    struct stat mystat; 

    mydir = opendir(argv[1]); 
    while((myfile = readdir(mydir)) != NULL) 
    { 
     stat(myfile->d_name, &mystat);  
     printf("%d",mystat.st_size); 
     printf(" %s\n", myfile->d_name); 
    } 
    closedir(mydir); 
} 

Das sind meine Ergebnisse nach der Ausführung des Codes:

[[email protected] ~]# ./a.out Downloads 
4096 .. 
4096 hw22.c 
4096 ankur.txt 
4096 . 
4096 destination.txt 

Hier sind die richtigen Größen:

[[email protected] ~]# ls -al Downloads 
total 20 
drwxr-xr-x. 2 root root 4096 Nov 26 01:35 . 
dr-xr-x---. 24 root root 4096 Nov 26 01:29 .. 
-rw-r--r--. 1 root root 27 Nov 21 06:32 ankur.txt 
-rw-r--r--. 1 root root 38 Nov 21 06:50 destination.txt 
-rw-r--r--. 1 root root 1139 Nov 25 23:38 hw22.c 

Kann jemand bitte meinen Fehler hinweisen.

Danke,

Ankur

+2

Funktioniert in Ordnung für mich. Überprüfen Sie den Rückgabewert von stat(), um festzustellen, ob ein Fehler vorliegt. – Neal

+1

Funktioniert auch hier gut. Führen Sie Fehlerprüfungen für alles ein (opendir(), readdir(), stat()). –

+0

Funktioniert gut, wenn Sie es auf '.' Ausführen, aber nicht, wenn Sie es ein anderes Verzeichnis geben. –

Antwort

13

myfile->d_name ist der Dateiname nicht der Weg, so müssen Sie den Dateinamen in das Verzeichnis "Downloads/file.txt" zuerst anhängen, wenn es nicht das Verzeichnis Arbeits ist:

char buf[512];  
while((myfile = readdir(mydir)) != NULL) 
{ 
    sprintf(buf, "%s/%s", argv[1], myfile->d_name); 
    stat(buf, &mystat); 
.... 

Wie, warum er druckt 4096 das ist die Größe der Links . und .. aus dem letzten Aufruf von stat().

Hinweis: Sie sollten einen Puffer zuweisen groß genug, um die Verzeichnisnamen zu halten, benennen Sie die Datei mit dem NULL Byte und den Separator, so etwas wie diese

strlen(argv[1]) + NAME_MAX + 2; 
+0

Vielen Dank für Ihre Antwort, so dass Ihre vorgeschlagenen Ergänzungen funktionierten. Das Programm gibt jetzt die richtigen Dateigrößen an. Vielen Dank. – ankur3000

+0

@ ankur3000 bitte, überprüfen Sie auch die Notiz, die ich hinzugefügt habe. – iabdalkader

+0

Das ist unglaublich nützlich, wenn ich meine OS-Papiere mache, die ich brauche, um Treiber im Kernel 2.6.39 zu installieren, die mit qemu und nur einer Init emulieren. Ich habe immer noch nichts herausgefunden aber danke !! Haha!! –

0

Das Problem ist, dass, wenn Sie stat("ankur.txt", &mystat), Sie "Downloads/ankur.txt" auf die Datei nicht funktioniert. Höchstwahrscheinlich ist die stat() fehlgeschlagen; alternativ berichtet es über eine andere Datei.

Daher müssen Sie prüfen, ob Ihr System fstatat() - neu in POSIX 2008 - unterstützt oder den Namen der Datei mit dem Namen des Verzeichnisses voranstellen.

1

Ich glaube, Sie werden feststellen, dass beobachten, wenn Sie ./a.out . Sie wird das Verhalten erhalten, das Sie erwarten.

Sie haben einen etwas subtilen Fehler, zu beobachten, wenn Sie den Rückgabecode des Anrufs zu stat(2) untersuchen.

Der grundlegende Fehler: Die dirent s durch readdir(2) (die myfile in Ihrem Code) zurückgegeben wird eine d_name relativ zu mydir. Ihr Code wird stat.. ersten, erfolgreich zu sein, und so mystat gültige Daten für .. enthalten, dann werden alle nachfolgenden Anrufe an stat(2) fehl, Rückkehr -1, die Sie prüfen nicht, für, so mystat wird nicht geändert, und Sie werden das Drucken st_size für den alten Wert, dh, dass die ...

+0

Danke für Ihre Antwort, ich sehe das Problem jetzt in meinem Code. Aber warum genau passiert das? Ich dachte, wenn wir den Befehl opendir() ausführen, passt das Programm automatisch die Dateipfade für dieses Verzeichnis an. – ankur3000

-5

oder vielleicht auch nur System ("ls -al") wird auch funktionieren!

+1

beantwortet es die Frage überhaupt nicht. – Puriney

6

Dies ist der letzte Code, den ich für alle Interessierten arbeiten konnte. Es druckt die korrekten Dateigrößen. Der Kredit geht an den Fragesteller und den Mux für die Beantwortung, wobei er den Code zusammenfügt. Input Ich habe das für die Arbeit "./main." .

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main(int argc, char* argv[]) 
{ 
    DIR *mydir; 
    struct dirent *myfile; 
    struct stat mystat; 

    char buf[512]; 
    mydir = opendir(argv[1]); 
    while((myfile = readdir(mydir)) != NULL) 
    { 
     sprintf(buf, "%s/%s", argv[1], myfile->d_name); 
     stat(buf, &mystat); 
     printf("%zu",mystat.st_size); 
     printf(" %s\n", myfile->d_name); 
    } 
    closedir(mydir); 
}