2011-02-07 2 views
20

MSDN nói rằng FileStream.Flush(True) "cũng xóa tất cả bộ đệm tệp trung gian.".Sự khác nhau giữa FileStream.Flush() và FileStream.Flush (True) là gì?

"Tất cả bộ đệm tệp trung gian" có nghĩa là gì?

+1

Lưu ý Flush (true) bị hỏng trong một số điều kiện nhất định cho mỗi báo cáo lỗi MS http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-to-disk # chi tiết. MS đã sửa nó, nhưng sẽ không nói phiên bản .NET nào được sửa. – jimvfr

+0

Bất kỳ từ nào trên phiên bản .NET nào. Lỗi này được sửa trong? – BaltoStar

Trả lời

23

Điều này làm cho dữ liệu tệp được đệm trong bộ nhớ cache của tệp hệ thống được ghi vào đĩa. Dữ liệu đó thường được viết lơ lửng, dựa trên vị trí của đầu viết đĩa. Có một gigabyte dữ liệu được lưu trữ là kỹ thuật có thể để nó có thể mất nhiều thời gian. Nếu điều này quan trọng với bạn thì hãy xem xét tùy chọn FileOptions.WriteThrough. Nó vô hiệu hóa ghi bộ nhớ đệm hoàn toàn. Điều này có thể rất tốn kém; bạn sẽ khám phá ra làm thế nào đĩa cứng chậm thực sự là.

0

này sẽ thực hiện cuộc gọi thêm để tuôn ra bộ đệm sang file:

Win32Native.FlushFileBuffers(this._handle); 
+2

Bạn có muốn đăng mã nguồn từ việc triển khai MS không? (mặc dù thực tế là tôi nghĩ rằng toàn bộ mã ở đây không thêm giá trị cho câu trả lời) –

+1

Tôi đã sử dụng phản xạ để đảo ngược kỹ sư. Theer là không có gì bất hợp pháp với điều đó. – Aliostad

+1

Đăng mã nguồn - Điều này đã được thảo luận rất nhiều trên Meta. Ví dụ: http://meta.stackexchange.com/questions/74890/is-it-inappropriate-to-post-decompiled-code-from-the-net-bcl và http://meta.stackexchange.com/questions/ 20153/posting-code-from-reflector – bic

4

Khi bạn gọi Flush() hoặc Flush(false), FileStream "bản sao đến tập tin bất kỳ dữ liệu trước đây ghi vào bộ đệm và xóa bộ đệm (trừ cho trạng thái bộ mã hóa của nó) ". Bộ đệm ở đây có nghĩa là bộ đệm trong của lớp FileStream. Và sao chép vào tập tin không ghi dữ liệu vào đĩa. Nó chỉ chuyển dữ liệu đến hệ điều hành.

Nhưng, hoạt động IO trong hệ điều hành Windows cũng được lưu vào bộ đệm - việc ghi dữ liệu vào đĩa có thể bị trì hoãn cho đến khi hệ thống sẵn sàng thực hiện. Vì vậy, xóa tất cả bộ đệm trung gian thực thi ghi dữ liệu đệm vào đĩa. Bộ đệm ở đây có nghĩa là bộ đệm trong của Windows [File system cache].

BTW khi bạn đóng tệp, tất cả dữ liệu đã lưu sẽ được ghi vào đĩa tự động. Vì vậy, bạn cần công cụ này chỉ khi bạn cần dữ liệu được flushed trước khi xử lý tập tin sẽ được đóng lại.

+0

Không có "trạng thái bộ mã hóa" trong 'FileStream', phải mất byte - không phải ký tự - và chuyển chúng từ/sang đĩa. Có lẽ bạn đang nghĩ đến 'StreamWriter'? –