ใช่ นี่เป็นเพราะกระบวนการยังคงเขียนไปยังไฟล์และบัฟเฟอร์ไม่ได้ถูกล้าง
โดยปกติแล้ว เมื่อคุณต้องการเขียนไฟล์ คุณสามารถ (คร่าวๆ) ทำสิ่งต่อไปนี้:
1. สร้าง/เปิดไฟล์และดึง "channel" (ตัวจับ) ไปยังไฟล์
2. เขียนอะไรบางอย่าง
3. ล้างบัฟเฟอร์/ปิดไฟล์ "channel" (ที่จับ) (=commit to disk)
(จากนั้นทำซ้ำ 1, 2 และ 3 เมื่อต้องการเขียนอะไรอีก)
อย่างไรก็ตาม การทำแบบนั้นก็ไม่เป็นไรถ้าคุณต้องการเขียนบางอย่างนานๆ ครั้ง เพราะ "การเปิดที่จับไปยังไฟล์" และ "การล้างบัฟเฟอร์" ไม่ใช่ "อิสระ" เมื่อเป็นเรื่องของประสิทธิภาพ
ซึ่งหมายความว่าหากคุณวางแผนที่จะเขียนไฟล์บ่อยๆ จะเป็นการดีกว่าที่จะเขียนเฉยๆ สร้าง/เปิดไฟล์
, แล้ว เขียน
หลายครั้งตามต้องการและเมื่อคุณทำเสร็จแล้ว ล้าง
หรือปิดที่จับ (ในตัวอย่างของฉันหมายถึง 1
, 2
[ทำซ้ำขั้นตอน 2
ตามความจำเป็น] จากนั้น ภายหลัง 3
)
และในขณะที่ข้อมูลไม่ได้ถูกล้างข้อมูลไปยังดิสก์ / คอมมิต: คุณไม่สามารถพึ่งพาได้!
Microsoft ให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้น:
การล้างข้อมูล I/O ที่ระบบบัฟเฟอร์ไปยังดิสก์
[...] Windows เก็บข้อมูลในการอ่านและเขียนไฟล์ในบัฟเฟอร์ข้อมูลที่ระบบดูแลเพื่อเพิ่มประสิทธิภาพการทำงานของดิสก์ เมื่อแอปพลิเคชันเขียนลงไฟล์ ระบบมักจะบัฟเฟอร์ข้อมูลและเขียนข้อมูลลงดิสก์เป็นประจำ[...]
เดอะ FlushFileBuffers เอกสาร Windows API พูดว่า:
[...] โดยปกติแล้ว ฟังก์ชัน WriteFile และ WriteFileEx จะเขียนข้อมูลไปยังบัฟเฟอร์ภายในที่ระบบปฏิบัติการเขียนไปยังดิสก์หรือไพพ์การสื่อสารเป็นประจำ ฟังก์ชัน FlushFileBuffers เขียนข้อมูลที่บัฟเฟอร์ทั้งหมดสำหรับไฟล์ที่ระบุไปยังอุปกรณ์หรือไพพ์
เนื่องจากการโต้ตอบการแคชดิสก์ภายในระบบ ฟังก์ชัน FlushFileBuffers อาจไม่มีประสิทธิภาพเมื่อใช้หลังจากเขียนทุกครั้งไปยังอุปกรณ์ดิสก์ไดรฟ์ เมื่อมีการเขียนหลายรายการแยกกัน[...]
สร้างไฟล์ เอกสาร:
[...] เมื่อแอปพลิเคชันเสร็จสิ้นโดยใช้ตัวจัดการวัตถุที่ส่งคืนโดย CreateFile ให้ใช้ฟังก์ชัน CloseHandle เพื่อปิดตัวจับ สิ่งนี้ไม่เพียงเพิ่มพื้นที่ว่างให้กับทรัพยากรระบบเท่านั้น แต่ยังมีอิทธิพลในวงกว้างต่อสิ่งต่างๆ เช่น การแชร์ไฟล์หรืออุปกรณ์ และการส่งข้อมูลไปยังดิสก์ ข้อมูลเฉพาะจะระบุไว้ในหัวข้อนี้ตามความเหมาะสม[...]
ข้อมูลเพิ่มเติมเกี่ยวกับ แคชไฟล์ได้ที่นี่โปรดทราบว่า:
ข้อมูลเมตาของระบบไฟล์จะถูกแคชไว้เสมอ ดังนั้น ในการจัดเก็บการเปลี่ยนแปลงข้อมูลเมตาใดๆ ลงในดิสก์ ไฟล์จะต้องล้างหรือเปิดด้วย FILE_FLAG_WRITE_THROUGH
ดังที่คุณเห็น ลักษณะการทำงานขึ้นอยู่กับการออกแบบของแอปพลิเคชัน ไม่ใช่เรื่องแปลกที่จะเห็นว่าไฟล์บันทึกจะถูกล้างข้อมูลลงดิสก์เป็นครั้งคราวเท่านั้นด้วยเหตุผลด้านประสิทธิภาพ และคุณไม่สามารถพึ่งพาข้อมูลเมตา เช่น วันที่/ เวลา ขนาดไฟล์ หรือแม้กระทั่งเนื้อหาไฟล์ในขณะที่แอปพลิเคชันยังคงเขียนไปยังไฟล์