Score:1

เนื้อหาไฟล์ Windows ไม่ได้รับการอัพเดตใน Explorer/Powershell

ธง cf

บน Windows Server เครื่องมือบันทึกจะเขียนไฟล์ .log ลงดิสก์อย่างต่อเนื่องและหมุนไฟล์บันทึกทุกวันตอนเที่ยงคืน ไฟล์บันทึกใหม่ถูกสร้างขึ้นทุกวัน แต่เกือบทุกวันเนื้อหา / ข้อมูลเมตาของไฟล์นั้นไม่ได้รับการอัปเดตหลังจากนั้นใน Windows Explorer และ Powershell

ตัวอย่าง: ไฟล์ถูกสร้างขึ้นเมื่อวันที่ 17 พฤษภาคม 2022 เวลา 00:00 น. มีขนาดประมาณ 24KB ใน Windows Explorer และมีเวลาเขียนครั้งสุดท้ายประมาณเที่ยงคืน (ฉันไม่ได้ตรวจสอบเวลาที่แน่นอนถึงวินาที) ถ้าฉันใช้ Powershell

(รับไอเทม).ความยาว

ฉันได้ขนาด 24401

ตอนนี้ เมื่อฉันคลิกขวาที่ไฟล์เดียวกันใน Windows Explorer และตรวจสอบคุณสมบัติของมัน มันจะอัปเดตขนาดเป็น 4,593KB และเวลาเขียนล่าสุดถึงวันที่ 17 พฤษภาคม 2022 เวลา 09:34 น. เวลาและขนาดที่แน่นอนไม่สำคัญ แต่ปัญหาคือ: เหตุใด Windows Explorer และ Windows Powershell จึงไม่ซิงค์กับระบบไฟล์พื้นฐานเช่นนั้น อะไรสามารถทำให้เกิดความแตกต่างเช่นนี้ได้?

อีกครั้งที่ฉันใช้สิ่งนี้เพื่อทดสอบว่าไฟล์ถูกคัดลอกไม่ตรงกันหรือมีเนื้อหาที่ถูกต้องหรือไม่:

รายการคัดลอก "..ไฟล์ต้นทาง .." -ปลายทาง "..ที่ไหนสักแห่ง.."

แอตทริบิวต์ของไฟล์ต้นฉบับได้รับการอัปเดต ดังนั้นฉันสามารถใช้มันเป็นวิธีแก้ปัญหาที่แย่มากเพื่อให้มีไฟล์เวอร์ชันล่าสุดอยู่เสมอใน Powershell เนื่องจากฉันกำลังวิเคราะห์ไฟล์ด้วยสคริปต์ Powershell และต้องการเนื้อหาทั้งหมดจริงๆ และ ไม่เพียงแต่เนื้อหาที่ไฟล์มีเมื่อสร้างเมื่อ 9 ชั่วโมงก่อนหน้านี้เท่านั้น

มีใครเคยเห็นพฤติกรรมแบบนี้ใน Windows บ้างไหม?

  • ระบบไฟล์: NTFS
  • ระบบปฏิบัติการ: Windows Server 2019 เวอร์ชัน 1809 Build 17763.2803
  • "ฮาร์ดแวร์": เซิร์ฟเวอร์เสมือนบนเซิร์ฟเวอร์ VMware ESXi
Score:0
ธง cn

ใช่ นี่เป็นเพราะกระบวนการยังคงเขียนไปยังไฟล์และบัฟเฟอร์ไม่ได้ถูกล้าง

โดยปกติแล้ว เมื่อคุณต้องการเขียนไฟล์ คุณสามารถ (คร่าวๆ) ทำสิ่งต่อไปนี้:

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

ดังที่คุณเห็น ลักษณะการทำงานขึ้นอยู่กับการออกแบบของแอปพลิเคชัน ไม่ใช่เรื่องแปลกที่จะเห็นว่าไฟล์บันทึกจะถูกล้างข้อมูลลงดิสก์เป็นครั้งคราวเท่านั้นด้วยเหตุผลด้านประสิทธิภาพ และคุณไม่สามารถพึ่งพาข้อมูลเมตา เช่น วันที่/ เวลา ขนาดไฟล์ หรือแม้กระทั่งเนื้อหาไฟล์ในขณะที่แอปพลิเคชันยังคงเขียนไปยังไฟล์

Johannes B. Latzel avatar
cf flag
ฉันไม่คิดว่าเป็นแอปพลิเคชันที่เป็นปัญหาที่นี่ ฉันลองสิ่งนี้เพื่อตรวจสอบสมมติฐาน: a) ฉันรีสตาร์ทเซิร์ฟเวอร์ (ดังนั้นตัวจัดการไฟล์ทั้งหมดจะถูกปิดหรือถูกละทิ้ง) b) ฉันตรวจสอบเวลาเขียนล่าสุด: ประทับตราจากก่อนเวลาของขั้นตอน a) c) ฉันตรวจสอบคุณสมบัติ ของไฟล์ ง) ฉันตรวจสอบเวลาเขียนล่าสุด: ประทับตราจากหลังขั้นตอน a) หากเป็นปัญหาของแอปพลิเคชันในการเขียน/ล้างข้อมูล ข้อมูลเมตาหลังจากการรีสตาร์ทควรเป็นข้อมูลล่าสุดแล้ว แต่ไม่ใช่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา