Tôi cần tạo một bộ xử lý tệp mới để mọi thao tác ghi vào xử lý đó được ghi vào đĩa ngay lập tức.Win32: Ghi vào tệp mà không bị giật?
Thông tin bổ sung: Tay cầm sẽ là STDOUT được thừa kế của một tiến trình con, vì vậy tôi cần bất kỳ đầu ra nào từ quy trình đó để ghi ngay vào đĩa.
Nghiên cứu các tài liệu CreateFile
, cờ FILE_FLAG_WRITE_THROUGH
trông giống như chính xác những gì tôi cần:
Viết hoạt động sẽ không đi qua bất kỳ bộ nhớ cache trung gian, họ sẽ đi trực tiếp vào đĩa.
Tôi đã viết một chương trình thử nghiệm rất cơ bản và, tốt, nó không hoạt động. Tôi đã sử dụng cờ trên CreateFile sau đó sử dụng WriteFile(myHandle,...)
trong một vòng lặp dài, viết khoảng 100MB dữ liệu trong khoảng 15 giây. (Tôi đã thêm một số Sleep()
's).
Sau đó tôi thiết lập môi trường giám sát chuyên nghiệp bao gồm liên tục nhấn 'F5' trong trình khám phá. Kết quả: tệp ở 0kB sau đó nhảy tới 100MB về thời gian chương trình thử nghiệm kết thúc.
Điều tiếp theo tôi đã thử là xóa thủ công tệp sau mỗi lần viết, với FlushFileBuffers(myHandle)
. Điều này làm cho kích thước tập tin quan sát phát triển tốt đẹp và ổn định, như mong đợi.
Câu hỏi của tôi là, sau đó, không nên FILE_FLAG_WRITE_THROUGH
đã thực hiện việc này mà không cần xóa tệp thủ công? Tui bỏ lỡ điều gì vậy? Trong chương trình 'thế giới thực', tôi không thể xóa tệp, vì tôi không có bất kỳ sự kiểm soát nào đối với tiến trình con đang sử dụng nó.
Ngoài ra còn có cờ FILE_FLAG_NO_BUFFERING
, tôi không thể sử dụng cùng lý do - không kiểm soát quá trình đang sử dụng tay cầm, vì vậy tôi không thể căn chỉnh viết theo cách thủ công theo cờ này.
EDIT: Tôi đã tạo một dự án riêng biệt để xem cách kích thước của tệp thay đổi. Nó sử dụng lớp .NET FileSystemWatcher
. Tôi cũng viết ít dữ liệu hơn - tổng cộng khoảng 100kB.
Đây là đầu ra. Kiểm tra các giây trong dấu thời gian.
Các 'được xây dựng trong không-đệm' phiên bản:
25.11.2008 7:03:22 PM: 10230 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10200 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10190 bytes added.
... và 'buộc (thủ công) tuôn ra' phiên bản (FlushFileBuffers()
được gọi mỗi ~ 2,5 giây):
25.11.2008 7:06:10 PM: 10230 bytes added.
25.11.2008 7:06:12 PM: 10230 bytes added.
25.11.2008 7:06:15 PM: 10230 bytes added.
25.11.2008 7:06:17 PM: 10230 bytes added.
25.11.2008 7:06:19 PM: 10230 bytes added.
25.11.2008 7:06:21 PM: 10230 bytes added.
25.11.2008 7:06:23 PM: 10230 bytes added.
25.11.2008 7:06:25 PM: 10230 bytes added.
25.11.2008 7:06:27 PM: 10230 bytes added.
25.11.2008 7:06:29 PM: 10230 bytes added.
tại sao bạn nghĩ bạn cần điều này? – Tim
+1 cho 'trình khám phá chuyên nghiệp + F5'. Nhưng tôi phải nhắc bạn rằng khả năng hiển thị trong cùng một hệ thống op không có nghĩa là 'xả/độ bền'. Bạn phải hành động chuyên nghiệp hơn: hoặc đặt lại PC hoặc giải nén ổ cứng khỏi hệ thống. Tôi không chắc chắn rằng thiết lập lại hoặc tắt nguồn sẽ không bắt đầu xả bộ nhớ đệm trên bo mạch. Chỉ khi bạn loại bỏ ổ đĩa vật lý, hoặc sử dụng một số lưu trữ giả, bạn có thể chắc chắn rằng xả nước đã đạt đến thiết bị thực sự. – Val
@RecognizeEvilasWaste hmm ... chúng ta hãy xem nếu nó wor –