2010-08-18 10 views
8

Ich versuche herauszufinden, wie man genau stat() verwendet, um Informationen über eine Datei zu erfassen. Was ich brauche, ist, mehrere Informationsfelder über eine Datei drucken zu können. So ..Verwenden von Struct Stat()

#include <iostream> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
using namespace std; 

int main() { 
    struct stat buf; 
    stat("file",&buf); 
       ... 
    cout << st_dev << endl; 
    cout << st_ino << endl; 
    cout << st_mode << endl; 
    cout << st_nlink << endl; 
    cout << st_uid << endl; 
    cout << st_gid << endl; 
    cout << st_rdev << endl; 
    cout << st_size << endl; 
    cout << st_blksize << endl; 
    cout << st_blocks << endl; 
    cout << st_atime << endl; 
    cout << st_mtime << endl; 
    cout << st_ctime << endl; 
    ... 
} 

Ich bin gründlich verwirrt darüber, wie dies zu tun ist. Warum ist & ein Parameter zu Stat? Es ist mir egal, diese Informationen im Speicher zu speichern, ich brauche nur die ausgegebenen Felder in meinem C++ Programm. Wie greife ich auf die in der Struktur enthaltenen Informationen zu? Soll buf tatsächlich die zurückgegebenen Informationen von stat() enthalten?

+0

ich sehe, danke alle für die Antworten. Sie waren sehr hilfreich. Weiß jemand, wie stdin, stdout oder stderr als Parameter für stat funktioniert? Dies sind Streams und keine Dateien. Wie kann stat eine Struktur mit Daten füllen? –

+0

Verwenden Sie 'fstat', das anstelle eines Pfads einen Dateideskriptor als erstes Argument verwendet. –

+0

Normalerweise würde ich das tun, aber die Umgebung ist etwas künstlich, da dies der OS-Teil eines Architektur-Simulators ist, den ich geschrieben habe. Wenn also eine Datei von einem Systemaufruf geöffnet wird, habe ich einen eigenen Vektor, der als Dateideskriptortabelle fungiert. Gibt es eine gute Möglichkeit, den tatsächlichen Dateideskriptor auf dem Computer für eine geöffnete Datei zu erfassen? Wenn das der Fall wäre, würde ich fstat verwenden, da keine Übersetzung zwischen Stream-Statistiken und Datei-Statistiken erforderlich wäre. –

Antwort

11

Ja, buf wird hier als Out-Parameter verwendet. Die Ergebnisse werden in buf gespeichert und der Rückgabewert stat ist ein Fehlercode, der angibt, ob die Operation stat erfolgreich war oder fehlgeschlagen ist.

Dies geschieht auf diese Weise, weil stat eine POSIX-Funktion ist, die für C entwickelt wurde und keine Out-of-Band-Fehlerberichterstattungsmechanismen wie Ausnahmen unterstützt. Wenn stat eine Struktur zurückgibt, dann hätte es keine Möglichkeit, Fehler anzuzeigen. Mit dieser Out-Parameter-Methode kann der Aufrufer auch auswählen, wo die Ergebnisse gespeichert werden sollen. Dies ist jedoch eine Nebenfunktion. Es ist völlig in Ordnung, die Adresse einer normalen lokalen Variablen zu übergeben, genau wie hier.

Sie greifen auf die Felder einer Struktur wie jedes andere Objekt zu. Ich nehme an, Sie sind zumindest mit Objektnotation vertraut? Z.B. Das st_dev Feld innerhalb der stat Struktur namens buf wird von buf.st_dev zugegriffen. Also:

cout << buf.st_dev << endl; 

usw.

2

Sie haben mehrere Fehler im Code:

  • Sie &buf müssen, mit einem einzigen 'f'.
  • Sie müssen z. buf.st_dev beim Drucken, da st_dev ein Feld in der Strukturvariablen ist.

Da buf ist eine lokale Variable auf dem Stapel, sind Sie nicht „Speichern Sie die Werte in dem Speicher“ permanent, es ist nur so lange, wie diese Variable im Gültigkeitsbereich ist.

So geben Sie mehrere Werte zurück, normalerweise in C und C++. Sie übergeben einen Zeiger auf eine Struktur und die aufgerufene Funktion füllt die Struktur mit den Werten, die sie für Sie berechnet hat.

1

buf ist die Struktur, die Lasten mit den Informationen über die Datei stat Sie im ersten Parameter übergeben. Sie übergeben &buf hier b/c Sie haben buf auf dem Stapel als eine lokale Variable zugewiesen und Sie müssen einen Zeiger auf die Statistikfunktion übergeben, um es zu ermöglichen, die Daten zu laden.

Alle Variablen von st_* Teil der Struktur stat Objekt sind und müssen daher über Ihren lokalen buf Variable als buf.st_uid usw.

3

Für ein anderes Projekt zugegriffen werden, habe ich eine kleine Funktion, die etwas tut, peitschte Similiar zu was du brauchst. Werfen Sie einen Blick auf sprintstatf.

Hier ist ein Beispiel für die Nutzung:

#include <sys/stat.h> 
#include <stdlib.h> 
#include <stdio.h> 

#include "sprintstatf.h" 

int 
main(int argc, char *argv[]) 
{ 
    char *outbuf = (char *)malloc(2048 * sizeof(char)); 
    struct stat stbuf; 
    char *fmt = \ 
     "st_atime (decimal) = \"%a\"\n" 
     "st_atime (string) = \"%A\"\n" 
     "st_ctime (decimal) = \"%c\"\n" 
     "st_ctime (string) = \"%C\"\n" 
     "st_gid (decimal) = \"%g\"\n" 
     "st_gid (string) = \"%G\"\n" 
     "st_ino    = \"%i\"\n" 
     "st_mtime (decimal) = \"%m\"\n" 
     "st_mtime (string) = \"%M\"\n" 
     "st_nlink   = \"%n\"\n" 
     "st_mode (octal) = \"%p\"\n" 
     "st_mode (string) = \"%P\"\n" 
     "st_size   = \"%s\"\n" 
     "st_uid    = \"%u\"\n" 
     "st_uid    = \"%U\"\n"; 

    lstat(argv[1], &stbuf); 

    sprintstatf(outbuf, fmt, &stbuf); 
    printf("%s", outbuf); 

    free(outbuf); 
    exit(EXIT_SUCCESS); 
} 

/* EOF */ 
1

Diese Frage zu alt i zu kommentieren Art und Weise kann aber als Referenz bin Entsendung

Um ein gutes Verständnis über stat() Funktion, die zu erhalten Grund für den Stat Bezug vorbei und was noch wichtige Fehlerbehandlung wird gut erklärt in dem unten stehenden Link

stat - get file status