2010-08-18 16 views
8

Próbuję dowiedzieć się, jak dokładnie używać stat() do przechwytywania informacji o pliku. To, czego potrzebuję, to móc wydrukować kilka pól informacji o pliku. Więc ..Using 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; 
    ... 
} 

Jestem całkowicie zdezorientowany, jak to zrobić. Dlaczego & buf jest parametrem stat? Nie obchodzi mnie przechowywanie tych informacji w pamięci, potrzebuję tylko wyprowadzonych pól w moim programie C++. Jak uzyskać dostęp do informacji zawartych w struct? Czy buf rzeczywiście powinien zawierać zwrócone informacje ze stat()?

+0

widzę, Dziękuje wszystkim za odpowiedzi. Byli bardzo pomocni. Czy ktoś wie, jak używać stdin, stdout lub stderr jako parametry do statystyk? Są to strumienie, a nie pliki, więc w jaki sposób stat może wypełnić strukturę danymi? –

+0

Użyj 'fstat', który pobiera deskryptor pliku jako pierwszy argument zamiast ścieżki. –

+0

Zwykle robiłbym to, ale środowisko jest nieco sztuczne, ponieważ jest to część systemu operacyjnego symulatora architektonicznego, który napisałem. Więc kiedy plik jest otwierany przez syscall, mam swój własny wektor do działania jako tablica deskryptorów plików. Czy istnieje dobry sposób na przechwycenie rzeczywistego deskryptora pliku na komputerze dla pliku w momencie jego otwarcia? Gdyby tak było, użyłbym fstat, ponieważ żadne tłumaczenie nie byłoby wymagane między statystyką strumienia a statystyką pliku. –

Odpowiedz

11

Tak, jest tutaj używany jako parametr wyjściowy. Wyniki są przechowywane w buf, a zwracana wartość stat jest kodem błędu wskazującym, czy operacja stat powiodła się, czy też się nie powiodła.

Wykonuje się to w ten sposób, ponieważ stat jest funkcją POSIX, zaprojektowaną dla języka C, która nie obsługuje mechanizmów raportowania błędów poza pasmem, takich jak wyjątki. Jeśli statzwrócił struct, to nie byłoby sposobu, aby wskazać błędy. Korzystanie z tej metody out-parametr pozwala również dzwoniącemu wybrać miejsce, w którym mają być przechowywane wyniki, ale jest to funkcja dodatkowa. Całkiem dobrze jest podać adres normalnej zmiennej lokalnej, tak jak tutaj.

Użytkownik uzyskuje dostęp do pól struktury podobnie jak każdy inny obiekt. Przypuszczam, że jesteś przynajmniej znany z notacji obiektowej? Na przykład. Pole st_dev w ramach struktury stat o nazwie buf jest dostępne pod numerem buf.st_dev. Więc:

cout << buf.st_dev << endl; 

itp

2

Masz kilka błędów w kodzie:

  • Ty potrzebujesz &buf, z jednym 'F'.
  • Musisz powiedzieć np. buf.st_dev podczas drukowania, ponieważ st_dev jest polem w zmiennej struct.

Ponieważ buf jest zmienną lokalną na stosie, nie "zapisuje wartości do pamięci" na stałe, jest tak długo, jak długo ta zmienna jest w zasięgu.

Oto sposób zwracania wielu wartości, zazwyczaj w C i C++. Przekazujesz wskaźnik do struktury, a wywoływana funkcja wypełnia strukturę wartościami, które obliczyła dla ciebie.

1

buf jest struktura stat ładunki z informacjami o pliku przepustkę pierwszego parametru. Przekazujesz &buf tutaj b/c masz buf przydzielony na stosie jako zmienną lokalną i musisz przekazać wskaźnik do funkcji statystycznej, aby umożliwić jej załadowanie danych.

Wszystkie zmienne st_* są częścią obiektu struct stat, a więc muszą być dostępne za pośrednictwem lokalnego buf zmiennej jako buf.st_uid itp

3

dla innego projektu, ja się trochę bitej funkcję, która robi coś podobnego do tego, czego potrzebujesz. Spójrz na sprintstatf.

Oto przykład użycia:

#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

To pytanie może być sposobem na stary, żeby komentować, ale jestem delegowania to jako odniesienie

Aby uzyskać dobre zrozumienie o stat funkcji(), to powodem przekazując odwołanie stat, a co ważniejsze obsługę błędów wyjaśnione są dobre w linku poniżej

stat - get file status