2011-06-30 15 views
10

Sé que puedo obtener el tamaño de archivo de FILE * por fseek, pero lo que tengo es solo un fd INT.¿Cómo se obtiene el tamaño del archivo por fd?

¿Cómo puedo obtener el tamaño de archivo en este caso?

+0

Try [ 'fdopen'] (http://pubs.opengroup.org /onlinepubs/9699919799/functions/fdopen.html) para obtener un 'FILE *' de un descriptor de archivo. – pmg

+0

AFAIR C (es decir, la biblioteca C) no sabe nada sobre los descriptores de archivos. Por favor, sea más preciso en su pregunta y sus etiquetas. –

Respuesta

13

Puede utilizar lseek con SEEK_END como el origen, ya que devuelve el nuevo desplazamiento en el fichero, por ejemplo.

off_t fsize; 

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

Creo que será bueno mencionar que es una buena idea retroceder el "puntero" de lectura/escritura ya que es posible que no se pueda leer después de esto. – gubble

14

fstat funcionará. Pero no estoy exactamente seguro de cómo planeas obtener el tamaño del archivo a través de fseek a menos que también uses ftell (por ejemplo, fseek hasta el final, y luego digas dónde estás). fstat es mejor, incluso para FILE, ya que puede obtener el descriptor de archivo desde el controlador FILE (a través de 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

me gusta escribir mis ejemplos de código como funciones para que estén listos para cortar y pegarlo en el código:

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); 
} 
Cuestiones relacionadas