2011-06-30 22 views
10

Tôi biết tôi có thể nhận kích thước tệp là FILE * bởi fseek, nhưng những gì tôi có chỉ là INT fd.Làm thế nào để bạn nhận được kích thước tệp bằng fd?

Làm cách nào để có kích thước tệp trong trường hợp này?

+0

Thử [ 'fdopen'] (http://pubs.opengroup.org /onlinepubs/9699919799/functions/fdopen.html) để có được một 'FILE *' trong một bộ mô tả tập tin. – pmg

+0

AFAIR C (nghĩa là thư viện C) không biết gì về các bộ mô tả tệp. Hãy chính xác hơn trong câu hỏi của bạn và các thẻ của bạn. –

Trả lời

13

Bạn có thể sử dụng lseek với SEEK_END như nguồn gốc, vì nó trả về mới bù đắp trong tập tin, ví dụ.

off_t fsize; 

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

Tôi nghĩ sẽ tốt nếu bạn đề cập đến việc di chuyển lại "con trỏ" đọc/ghi là có thể không đọc được sau này. – gubble

14

fstat sẽ hoạt động. Nhưng tôi không chính xác chắc chắn làm thế nào bạn có kế hoạch nhận được kích thước tập tin thông qua fseek trừ khi bạn cũng sử dụng ftell (ví dụ như fseek đến cùng, sau đó ftell bạn đang ở đâu). fstat là tốt hơn, ngay cả đối với FILE, vì bạn có thể lấy bộ mô tả tập tin từ trình xử lý FILE (thông qua 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

Tôi thích viết mẫu mã của tôi như các chức năng để họ sẵn sàng để cắt và dán vào mã:

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); 
} 
Các vấn đề liên quan