2008-11-19 38 views
11

Tôi cố gắng ghi vào một tệp lớn, nhưng có vẻ như nó không hoạt động đối với các tệp lớn hơn 2GB. Tôi đã thử với tăng :: iostreams :: file_sink. Đây có phải chỉ là giới hạn với luồng tăng không? Có cách nào khác tôi có thể viết một tập tin lớn trên Win64 và win32?Viết tập tin lớn

Trả lời

9

này phụ thuộc vào:

  • Các hệ thống tập tin mà bạn đang sử dụng. Các hệ thống tệp cũ như FAT chỉ cho phép các tệp có dung lượng tối đa 2GB. Sử dụng NTFS.
  • Thư viện của bạn phải được biên soạn để cho phép các tệp lớn (64 bit tìm kiếm bù). Nếu họ sử dụng 32 bit ints để tìm kiếm trong tập tin (kiểm tra các đối số và kết quả của các cuộc gọi "tìm kiếm" và "nói"), bạn chỉ có thể truy cập 2GB (2^31bits, thứ 32 là dấu +/-)

này cũng có thể giúp: http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/faq.html#offsets

+0

"Thirtytwoth"? Tôi chỉ không thể giúp bản thân mình :) – korona

+0

"Chúng tôi đang nói ngữ pháp ở đây, ý nghĩa là một vấn đề khác" - Tôi không nhớ nơi tôi đọc điều đó. –

+0

Cảm ơn :) offset_to_position được tìm thấy trong liên kết của bạn đã thực hiện thủ thuật – user38941

5

Trong Win32/64 ReadFile WriteFile & có thể ghi tập tin lớn hơn 4GB. Việc định vị được thực hiện thông qua một giá trị _LARGE_INTEGER 64 bit trong SetFilePointerEx. Tương tự như vậy để có được kích thước tập tin bạn cần GetFileSizeEx và không phải là GetFileSize cơ bản.

1

Trong NTFS, giới hạn thực duy nhất là kích thước của ổ đĩa. Nếu bạn muốn kiểm tra này ra bạn có thể tạo một tập tin dummy bằng cách sử dụng dòng lệnh:
fsutil tập tin createnew [filename] [validdatalength]
Ex:
fsutil tập tin TestFile.bin createnew 65536000000
Điều đó sẽ tạo ra một 64GB tập tin giả sử bạn có một ổ đĩa NTFS.

+0

Tôi chưa bao giờ biết về fsutil. Cảm ơn! – Ferruccio