2010-03-11 21 views
8

Tôi cần xác định kích thước byte của tệp.Cách di động để lấy kích thước tệp trong C/C++

Ngôn ngữ mã hóa là C++ và mã sẽ hoạt động với Linux, cửa sổ và bất kỳ hệ điều hành nào khác. Điều này ngụ ý sử dụng các hàm/lớp C hoặc C++ chuẩn.

Nhu cầu tầm thường này dường như không có giải pháp tầm thường.

+0

http://stackoverflow.com/questions/2282549/c-getting-incorrect-file-size/2289423#2289423 –

Trả lời

8

dùng của std dòng bạn có thể sử dụng:

std::ifstream ifile(....); 
ifile.seekg(0, std::ios_base::end);//seek to end 
//now get current position as length of file 
ifile.tellg(); 

Nếu bạn đối phó với ghi chỉ nộp (std :: ofstream), sau đó phương pháp là một số khác:

ofile.seekp(0, std::ios_base::end); 
ofile.tellp(); 
+4

Mở tập tin trong hệ nhị phân hoặc bạn có thể nhận được kết quả sai. Văn bản ifstreams có thể làm '\ r \ n' thành bản dịch' \ n'. – MSalters

+0

Vấn đề là tellg() trả về một giá trị của kiểu streampos. Nó thường là một int, nhưng nó cũng có thể là một loại khác. Mặc dù tôi sẽ giữ nó như một câu trả lời. – chmike

+0

Câu trả lời của tôi thực sự phản ánh thực tế đó bởi vì sự lặp lại đầu tiên của tôi đã vượt khỏi đỉnh đầu của tôi cho đến khi ai đó chỉ ra sai lầm và đánh dấu tôi xuống cho nó. –

0

Simples:

std::ifstream ifs; 
ifs.open("mybigfile.txt", std::ios::bin); 
ifs.seekg(0, std::ios::end); 
std::fpos pos = ifs.tellg(); 
+0

Trên các hệ thống 32 bit, size_t là 32 bit. Vì vậy, điều này không thành công với các tập tin 4GB hoặc lớn hơn. – user9876

+0

Tôi đã viết điều này ra khỏi vòng bít không có tham chiếu. Nhìn vào mã của tôi có một số vấn đề mà tôi đã sửa chữa. –

3

Nếu bạn chỉ cần kích thước tệp, điều này chắc chắn là quá mức cần thiết nhưng nói chung tôi sẽ đi với Boost.Filesystem f hoặc các hoạt động tệp độc lập với nền tảng. Trong số chức năng thuộc tính khác, nó chứa

template <class Path> uintmax_t file_size(const Path& p); 

Bạn có thể tìm thấy những tài liệu tham khảo here. Mặc dù thư viện Boost có vẻ rất lớn nhưng tôi thấy nó thường xuyên thực hiện những điều rất hiệu quả. Bạn cũng có thể chỉ trích xuất các chức năng mà bạn cần nhưng điều này có thể bằng chứng khó khăn như Boost là khá phức tạp.

6

Bạn có thể sử dụng hệ thống stat gọi:

#ifdef WIN32 
_stat64() 
#else 
stat64() 
+1

Cần lưu ý rằng họ có các chức năng 'stat' là một phần của POSIX, vì vậy chúng hoạt động trên các hệ thống giống UNIX và UNIX. –

-1

Thường thì chúng ta muốn nhận được những điều thực hiện theo phương thức cầm tay nhất, nhưng trong những tình huống nhất định, đặc biệt là như thế này, tôi sẽ khuyên bạn sử dụng hệ thống của API for best performance .

-1

Tính di động yêu cầu bạn sử dụng các mẫu số chung ít nhất, sẽ là C. (không phải C++) Phương pháp mà tôi sử dụng là như sau.

#include <stdio.h> 

long filesize(const char *filename) 
{ 
FILE *f = fopen(filename,"rb"); /* open the file in read only */ 

long size = 0; 
    if (fseek(f,0,SEEK_END)==0) /* seek was successful */ 
     size = ftell(f); 
    fclose(f); 
    return size; 
} 
+2

Rất tệ nếu bạn có tệp> kích thước 2GB trên nền tảng có 32 bit dài int –

+1

@DavidHeffernan có các phiên bản 64 bit của các chức năng đó. nhưng mà sang một bên, điều này đòi hỏi bạn để có thể mở tập tin và cũng chậm hơn rất nhiều. – chacham15

Các vấn đề liên quan