ทำไมฉันไม่สามารถเปลี่ยนแปลงไฟล์ที่ใช้งานบน Windows อย่างที่ฉันทำได้บน Linux และ OS X
เมื่อคุณใช้ Linux และ OS X ระบบปฏิบัติการจะไม่หยุดคุณไม่ให้ลบไฟล์ที่ใช้อยู่ในปัจจุบันบน Windows คุณจะถูกห้ามมิให้ทำเช่นนั้น สิ่งที่ช่วยให้? เหตุใดคุณจึงสามารถแก้ไขและลบไฟล์ที่ใช้งานบนระบบที่ได้รับ Unix แต่ไม่ใช่ Windows?
เซสชั่นคำถามและคำตอบในวันนี้มาถึงเราด้วยความอนุเคราะห์จาก SuperUser - แผนกย่อยของ Exchange Exchange ซึ่งเป็นกลุ่มที่ขับเคลื่อนด้วยชุมชนของเว็บไซต์ถาม - ตอบ.
คำถาม
SuperUser reader the.midget ต้องการทราบว่าเหตุใด Linux และ Windows จึงปฏิบัติต่อไฟล์ที่ใช้งานแตกต่างกัน:
หนึ่งในสิ่งที่ทำให้ฉันงงตั้งแต่เริ่มใช้ Linux คือความจริงที่ทำให้คุณสามารถเปลี่ยนชื่อไฟล์หรือลบมันในขณะที่กำลังอ่านอยู่ ตัวอย่างคือวิธีที่ฉันพยายามลบวิดีโอขณะที่เล่นโดยไม่ได้ตั้งใจ ฉันประสบความสำเร็จและรู้สึกประหลาดใจเมื่อฉันรู้ว่าคุณสามารถเปลี่ยนแปลงอะไรก็ได้ในไฟล์โดยไม่สนใจว่ามันถูกใช้ในขณะนั้นหรือไม่.
ดังนั้นสิ่งที่เกิดขึ้นเบื้องหลังและป้องกันไม่ให้เขาลบสิ่งต่าง ๆ ใน Windows อย่างที่เขาสามารถทำได้ใน Linux?
คำตอบ
ผู้มีส่วนร่วม SuperUser แสดงความคิดเห็นเกี่ยวกับสถานการณ์สำหรับตัวติดตาม ประหลาดใจเขียน:
เมื่อใดก็ตามที่คุณเปิดหรือเรียกใช้ไฟล์ใน Windows Windows จะล็อคไฟล์ดังกล่าว (นี่เป็นการทำให้เข้าใจง่าย แต่โดยทั่วไปจะเป็นจริง) ไฟล์ที่ถูกล็อกโดยกระบวนการไม่สามารถลบได้จนกว่ากระบวนการนั้นจะเผยแพร่ นี่คือเหตุผลที่เมื่อใดก็ตามที่ Windows ต้องอัปเดตตัวเองคุณต้องรีบูตเพื่อให้มีผล.
ในทางตรงกันข้ามระบบปฏิบัติการแบบ Unix เช่น Linux และ Mac OS X ไม่ได้ล็อคไฟล์ แต่เป็นภาคดิสก์พื้นฐาน นี่อาจดูเหมือนความแตกต่างเล็กน้อย แต่ก็หมายความว่าบันทึกของไฟล์ในสารบัญของระบบไฟล์สามารถลบได้โดยไม่รบกวนโปรแกรมใด ๆ ที่เปิดไฟล์อยู่แล้ว ดังนั้นคุณสามารถลบไฟล์ในขณะที่มันยังคงดำเนินการหรือใช้งานอยู่และมันจะยังคงอยู่บนดิสก์ตราบใดที่บางกระบวนการมีการจัดการเปิดสำหรับมันแม้ว่ารายการของมันในตารางไฟล์จะหายไป.
David Schwartz ขยายแนวคิดและเน้นว่าสิ่งต่าง ๆ ควรเป็นอย่างไรและปฏิบัติอย่างไร:
Windows ใช้ค่าเริ่มต้นในการล็อกไฟล์โดยอัตโนมัติ UNIX ใช้ค่าเริ่มต้นเป็นการล็อกไฟล์แบบร่วมมือกัน ในทั้งสองกรณีค่าเริ่มต้นสามารถ overriden แต่ในทั้งสองกรณีพวกเขามักจะไม่.
รหัส Windows เก่าจำนวนมากใช้ C / C ++ API (ฟังก์ชั่นเช่น fopen) มากกว่า API ดั้งเดิม (ฟังก์ชั่นเช่น CreateFile) C / C ++ API ไม่มีวิธีการระบุว่าการล็อกบังคับจะทำงานอย่างไรดังนั้นคุณจะได้รับค่าเริ่มต้น "โหมดการแบ่งปัน" ที่เป็นค่าเริ่มต้นมีแนวโน้มที่จะห้ามการดำเนินการที่ "ขัดแย้งกัน" หากคุณเปิดไฟล์เพื่อเขียนการเขียนจะถือว่าขัดแย้งกันแม้ว่าคุณจะไม่ได้เขียนลงไฟล์ก็ตาม เหมือนกันสำหรับการเปลี่ยนชื่อ.
และนี่คือที่ที่มันแย่ลง นอกเหนือจากการเปิดอ่านหรือเขียน C / C ++ API ยังไม่มีวิธีระบุสิ่งที่คุณตั้งใจจะทำกับไฟล์ ดังนั้น API จะต้องสมมติว่าคุณกำลังดำเนินการทางกฎหมายใด ๆ เนื่องจากการล็อกเป็นสิ่งจำเป็นการเปิดที่อนุญาตการดำเนินการที่ขัดแย้งกันจะถูกปฏิเสธแม้ว่ารหัสไม่เคยตั้งใจจะทำการดำเนินการที่ขัดแย้งกัน แต่เพิ่งเปิดไฟล์เพื่อวัตถุประสงค์อื่น.
ดังนั้นหากรหัสใช้ C / C ++ API หรือใช้ Native API โดยไม่ต้องคำนึงถึงปัญหาเหล่านี้โดยเฉพาะพวกเขาจะปิดท้ายการป้องกันการดำเนินการที่เป็นไปได้สูงสุดสำหรับทุกไฟล์ที่พวกเขาเปิดและไม่สามารถเปิดไฟล์ได้ สามารถดำเนินการกับมันเมื่อเปิดไม่มีข้อโต้แย้ง.
ในความคิดของฉันวิธี Windows จะทำงานได้ดีกว่าวิธี UNIX ถ้าทุกโปรแกรมเลือกโหมดการแบ่งปันและเปิดโหมดอย่างชาญฉลาดและจัดการกรณีความล้มเหลวอย่างชาญฉลาด อย่างไรก็ตามวิธี UNIX จะทำงานได้ดีขึ้นถ้ารหัสไม่ต้องกังวลกับปัญหาเหล่านี้ น่าเสียดายที่ C / C ++ API ขั้นพื้นฐานไม่ได้จับคู่กับไฟล์ Windows API ในวิธีที่จัดการโหมดการแชร์และการเปิดที่ขัดแย้งกันได้ดี ดังนั้นผลลัพธ์สุทธิจึงค่อนข้างยุ่ง.
ที่นั่นคุณมี: วิธีการจัดการไฟล์ที่ต่างกันสองวิธีให้ผลลัพธ์ที่แตกต่างกันสองแบบ.
มีสิ่งที่จะเพิ่มคำอธิบายหรือไม่ ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่.