Zum Inhalt springen

wie funktioniert lstat() ?


Kadaj

Empfohlene Beiträge

Hallo,

ich versuche grade mir von einem Programm nur alle regulären Dateien auflisten zu lassen. Das funktioniert auch unter debian mit d_type:

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


int i = 0;
int lang = 0;

int main(int zahl, char *para[1])
{

DIR *verzeichnis;
struct dirent *eintrag;
verzeichnis = opendir(para[1]);

struct stat sb;


if(zahl != 2) //wurde genau 1 parameter übergeben?
{
printf("Fehler bei der Parameteruebergabe.\n");
printf("Es muss genau ein Parameter uebergeben werden!\n");
printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n");
return 0;
}

while((eintrag = readdir(verzeichnis)) != NULL)
{


if(eintrag->d_type == 8) // geht nicht unter suse
{
printf("%s\t", eintrag->d_name);
i++;
lang = lang + strlen(eintrag->d_name);
printf("Rueckgabe: %d ",eintrag->d_type);
printf("Laenge: %d \n",lang);

}

}
printf("\n%d Einträge gefunden\n",i);

return 0;
}
[/PHP]

aber, wie schon im Kommentar angemerkt, gibt es "d_type" nicht auf allen Distributionen und in der Aufagabe stand ohnehin, dass lstat() verwendet werden soll. Wenn ich aber die man-page aufrufe:

[CODE]man lstat[/CODE]

dann bekomme ich nur die Struktur von stat() und in stat() selbst gibt es keinen Eintrag, den ich verwenden kann um herauszufinden, ob es eine reguläre Datei ist.

Was mich auch verwirrt ist, dass unter example "struct stat sb;" steht, denn müsste dann nicht oben unter synopsis was davon stehen? Mit int "lstat(const char *path, struct stat *buf);" kann ich auch nichts anfangen, ich hab schon einiges ausprobiert, werde aber einfach nicht schlauer aus der Funktion, weiß jemand wie ich lstat bei mir verwenden müsste, oder gibt es ein Beispiel, an dem man es besser nachvollziehen kann als in der man-page? Im Netz hab ich auch nichts anschauliches gefunden.

Danke im Voraus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab mich geirrt, lstat kann mit S_IFREG überprüfen ob es sich um eine reguläre Datei handelt. Nur funktioniert es noch nicht so richtig. "eintrag" verändert sich bei jedem Durchlauf der Schleife, das sieht man, da sich ja auch d_name verändert. Die erste Zeile in meiner Schleife soll ja den Namen der Datei erfassen und ihn dann an "info" weitergeben. Jedoch funktioniert lstat nur beim ersten mal, denn bei der Ausgabe erhalte ich immer wieder die Größe der ersten Datei, sollte ein neuer Aufruf von lstat nicht einen neuen Wert in "info" schreiben? Hier der Code:


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

int i = 0;
int size = 0;

int main(int zahl, char *para[1])
{
DIR *verzeichnis;
struct dirent *eintrag;
verzeichnis = opendir(para[1]);
struct stat info;

if(zahl != 2)
{
printf("Fehler bei der Parameteruebergabe.\n");
printf("Es muss genau ein Parameter uebergeben werden!\n");
printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n");
return 0;
}

while((eintrag = readdir(verzeichnis)) != NULL)
{

lstat(eintrag->d_name, &info); //lstat braucht den Name und gibt alles an info weiter

if(S_ISDIR(info.st_mode))
{
printf("%s\t", eintrag->d_name);
i++;
size = size + info.st_size;
printf("Rueckgabe von d_type: %d ",eintrag->d_type);
printf("size der datei: %d ",info.st_size);
printf("size-gesamt: %d \n",size);
}
}
printf("\n%d Einträge gefunden\n",i);

return 0;
}

[/php]

Wäre echt super, wenn jemand den Fehler sieht, ich hab im Netz nur Beispiele gefunden, in denen nur der übergebene Parameter überprüft wird (in meinem Fall wäre das para[1] ) aber ich möchte lstat in einer Schleife durchlaufen lassen.

Hat jemand eine Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Wochen später...

Das Thema hab ich ja ganz vergessen. So funktioniert es:


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

int i = 0;
int size = 0;

int main(int zahl, char *para[1])
{
DIR *verzeichnis;
struct dirent *eintrag;
verzeichnis = opendir(para[1]);
struct stat info;

if(zahl != 2)
{
printf("Fehler bei der Parameteruebergabe.\n");
printf("Es muss genau ein Parameter uebergeben werden!\n");
printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n");
return 0;
}

while((eintrag = readdir(verzeichnis)) != NULL)
{

lstat(eintrag->d_name, &info); //lstat braucht den Name und gibt alles an info weiter

if(S_ISREG(info.st_mode))
{
printf("%-25s", eintrag->d_name);
//oder (*eintrag).d_name, () weisen an, dass erst dereferenziert werden muss
i++;
size = size + info.st_size;
printf("Rueckgabe von d_type: %3d ",eintrag->d_type);
printf("size der datei: %8d Byte ",info.st_size);
printf("size-gesamt: %9d Byte\n",size);
}
}
printf("\n%d Einträge gefunden\n",i);

return 0;
}
[/php]

Danke für die Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...