2011-06-30 7 views
10

Wiem, że mogę uzyskać rozmiar pliku FILE * przez fseek, ale to, co mam, to tylko INT fd.Jak uzyskać rozmiar pliku na FD?

Jak mogę uzyskać rozmiar pliku w tym przypadku?

+0

Try [ 'fdopen'] (http://pubs.opengroup.org /onlinepubs/9699919799/functions/fdopen.html), aby pobrać plik 'FILE * 'z deskryptora pliku. – pmg

+0

AFAIR C (tzn. Biblioteka C) nic nie wie o deskryptorach plików. Dokładniej wpisz swoje pytanie i swoje tagi. –

Odpowiedz

13

Można użyć lseek z SEEK_END jak pochodzenie, gdyż zwraca nowy przesunięcie w pliku, np.

off_t fsize; 

fsize = lseek(fd, 0, SEEK_END); 
+0

Myślę, że dobrze będzie wspomnieć, że dobrym pomysłem jest cofnięcie odczytu/zapisu "wskaźnika", ponieważ może nie być on w stanie czytać po tym. – gubble

14

fstat zadziała. Ale nie jestem do końca pewien, w jaki sposób planujesz uzyskać rozmiar pliku za pomocą fseek, chyba że użyjesz również ftell (np. Fseek do końca, a następnie ftell, gdzie jesteś). fstat jest lepszy, nawet dla FILE, ponieważ możesz dostać deskryptor pliku z uchwytu FILE (przez fileno).

stat, fstat, lstat - get file status 
    int fstat(int fd, struct stat *buf); 

     struct stat { 
     … 
      off_t  st_size; /* total size, in bytes */ 
     … 
     }; 
0

Lubię pisać moje próbki kodu jako funkcje są więc gotowe do wycinania i wklejania do kodu:

int fileSize(int fd) { 
    struct stat s; 
    if (fstat(fd, &s) == -1) { 
     int saveErrno = errno; 
     fprintf(stderr, "fstat(%d) returned errno=%d.", fd, saveErrno); 
     return(-1); 
    } 
    return(s.st_size); 
}