2009-04-24 13 views
16

TFileStream cung cấp đầu ra đệm, điều này rất tuyệt vời trong hầu hết các trường hợp, nhưng trong một số trường hợp (đặc biệt là trong quá trình gỡ lỗi) rất tốt để xóa bộ đệm ngay lập tức. Thing là, tôi không biết cách nào để làm điều đó ngoại trừ gọi miễn phí, đó là loại phản tác dụng.Làm thế nào để tuôn ra một TFileStream?

Có cách nào tốt hơn để làm điều đó không?

Trả lời

25

Bạn cần xả luồng. Thử:

FlushFileBuffers(fs.Handle); 

? Bạn có thấy/thử cái này không?

6

Tôi nghĩ câu trả lời của altCognito (FlushFileBuffers) có lẽ là tốt nhất, nhưng chỉ vì TFileStream không tự đệm. Đối với các luồng đệm khác, trước tiên nên xem luồng có cung cấp phương thức Flush hay không. Và như một phương sách cuối cùng bạn có thể sử dụng thủ thuật tìm kiếm cũ (bắt đầu) và sau đó tìm kiếm (CurrentPos).

6

Đó là một chút liên quan, nhưng bạn thực sự có thể kiểm soát rất nhiều hành vi đó trong lời gọi tới (win32 api) CreateFile. Bạn có thể thêm FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERING hoặc thậm chí cung cấp gợi ý tối ưu hóa cho hệ thống bộ nhớ cache với FILE_FLAG_SEQUENTIAL_SCAN hoặc FILE_FLAG_RANDOM_ACCESS. Để sử dụng TFileStream theo cách đó, tôi nghĩ bạn cần ghi đè lên Create để thay đổi cách nó có được xử lý tệp. FWIW, FlushFileBuffers tương đương với Đóng/Mở trên tệp. Nếu bạn đang thực hiện rất nhiều hoạt động với các lần lặp lại, nó sẽ làm chậm mã xuống đáng kể.

Một chút tài liệu here

+5

Thực ra, bạn không cần ghi đè hàm tạo. Đã có một phiên bản quá tải, chấp nhận một tập tin xử lý. Vì vậy, bạn phải tiến hành như sau (xử lý lỗi đã bị xóa): FS: = TFileStream.Create (CreateFile (PChar (Tên tệp), ..., FILE_FLAG_WRITE_THROUGH, ...)); Đó là tất cả. Thực sự đơn giản. – Alex

2

Bạn đang sử dụng một TWriter/Treader hoặc chỉ đi thẳng cho giao diện TFileStream? TReader và TWriter có bộ đệm bên trong. Nhưng đối với một dòng phim bình thường thì các câu trả lời ở trên đã được sắp xếp. Cá nhân tôi sẽ thực hiện luồng của riêng tôi bằng các phương pháp để xử lý trực tiếp.