เหตุใดฉันจึงไม่สามารถเปลี่ยนชื่อไฟล์ที่กำลังอ่านบน Windows อย่างที่ฉันสามารถทำได้บน Linux / Mac


23

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


2
การเปลี่ยนชื่อไฟล์ที่ล็อคไม่มีปัญหาใน Windows การลบมักจะมีไม่กี่โปรแกรมที่เปิดไฟล์โดยเปิดตัวเลือก FILE_SHARE_DELETE
Hans Passant

คุณไม่ได้ลบมันจริงๆคุณเพียงแค่ยกเลิกการเชื่อมโยงจากไดเรกทอรีมันไฟล์ยังคงมีอยู่มันอาจจะไม่มีชื่อในระบบไฟล์ (แม้ว่าจะยังคงมีชื่ออยู่ใน/procระบบไฟล์ผ่านโปรแกรมที่เปิดอยู่) ไฟล์สามารถถูกลบได้อย่างแท้จริงหากไม่มีการอ้างอิงเหลืออยู่เท่านั้นและสิ่งนี้จะเกิดขึ้นโดยอัตโนมัติ
David Schwartz

คำตอบ:


36

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

ในทางตรงกันข้ามระบบปฏิบัติการแบบ Unix เช่น Linux และ Mac OS X ไม่ได้ล็อคไฟล์ แต่เป็นภาคดิสก์พื้นฐาน นี่อาจดูเหมือนความแตกต่างเล็กน้อย แต่ก็หมายความว่าบันทึกไฟล์ในสารบัญของระบบไฟล์สามารถลบได้โดยไม่รบกวนโปรแกรมใด ๆ ที่เปิดไฟล์อยู่แล้ว ดังนั้นคุณสามารถลบไฟล์ในขณะที่มันยังคงดำเนินการหรือใช้งานอยู่และมันจะยังคงอยู่บนดิสก์ตราบใดที่บางกระบวนการมีการจัดการเปิดสำหรับมันแม้ว่ารายการของมันในตารางไฟล์จะหายไป


2
ขอบคุณสำหรับคำตอบนี้ มันอธิบายความแตกต่างให้ฉันมากขึ้น นอกจากนี้ยังช่วยอธิบายว่าทำไมการโหลดไฟล์ / วิดีโอขนาดใหญ่จึงไม่ใช้ RAM จำนวนมหาศาล มิฉะนั้นการเล่นวิดีโอขนาดใหญ่หนึ่งรายการอาจทำให้ระบบของคุณไม่ทำงาน
Jerry Saravia

4
หากคุณลบไฟล์ที่ใช้งานอยู่และคุณต้องการนำกลับมาใช้กับ Linux คุณสามารถค้นหารายการไฟล์ใน / proc ดังที่อธิบายไว้ในคำถามนี้
Ken Bloom

2
นี่เป็นเรื่องทั่วไป - ไม่อัพเดท Windows ทุกวันนี้ (บน Windows 7) ต้องมีการรีบู๊ตและฉันได้ทำ Linux มากมายที่ทำ
Alan B

10

Windows ใช้ค่าเริ่มต้นในการล็อกไฟล์โดยอัตโนมัติ UNIX ใช้ค่าเริ่มต้นเป็นการล็อกไฟล์แบบร่วมมือกัน ในทั้งสองกรณีค่าเริ่มต้นสามารถ overriden แต่ในทั้งสองกรณีพวกเขามักจะไม่

รหัส Windows เก่าจำนวนมากใช้ C / C ++ API (ฟังก์ชั่นที่ต้องการfopen) มากกว่า API ดั้งเดิม (ฟังก์ชั่นที่ชอบCreateFile) C / C ++ API ไม่มีวิธีการระบุว่าการล็อกบังคับจะทำงานอย่างไรดังนั้นคุณจะได้รับค่าเริ่มต้น "โหมดการแบ่งปัน" ที่เป็นค่าเริ่มต้นมีแนวโน้มที่จะห้ามการดำเนินการ "ที่ขัดแย้งกัน" หากคุณเปิดไฟล์เพื่อเขียนการเขียนจะถือว่าขัดแย้งกันแม้ว่าคุณจะไม่เคยเขียนไฟล์จริงๆก็ตาม เหมือนกันสำหรับการเปลี่ยนชื่อ

และนี่คือที่ที่มันแย่ลง นอกจากการเปิดอ่านหรือเขียนแล้ว C / C ++ API ยังไม่มีวิธีระบุสิ่งที่คุณตั้งใจจะทำกับไฟล์ ดังนั้น API จะต้องสมมติว่าคุณกำลังดำเนินการทางกฎหมายใด ๆ ตั้งแต่ล็อคมีผลบังคับใช้เป็นopenที่ช่วยให้การดำเนินการที่ขัดแย้งกันจะได้รับการปฏิเสธแม้ถ้ารหัสไม่เคยตั้งใจที่จะดำเนินการขัดแย้งกัน แต่เป็นเพียงการเปิดไฟล์เพื่อวัตถุประสงค์อื่น

ดังนั้นหากรหัสใช้ C / C ++ API หรือใช้ Native API โดยไม่ต้องคำนึงถึงปัญหาเหล่านี้โดยเฉพาะพวกเขาจะปิดท้ายการป้องกันชุดปฏิบัติการที่เป็นไปได้สูงสุดสำหรับทุกไฟล์ที่พวกเขาเปิดและไม่สามารถเปิดไฟล์ได้ สามารถดำเนินการกับมันเมื่อเปิดไม่มีข้อโต้แย้ง

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


0

นี่เป็นคำถามที่น่าสนใจมากและทำให้ฉันคิดถึงคำตอบที่เหมาะสม ฉันหวังว่าผู้อื่นสามารถให้การสำรองที่นี่

ฉันใช้ทั้ง Windows และ Linux และสังเกตสิ่งนี้เช่นกัน ฉันยังเป็นผู้ใช้เป็นกลุ่ม Vim จะอ่านไฟล์ข้อความเป็น 'buffer' หรือ RAM และจากนั้นจะไม่สัมผัสไฟล์จริงจนกว่าคุณจะบันทึก Linux อาจแสดงการดำเนินการประเภทนี้โดยทั่วไปกับไฟล์ทั้งหมด

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

Windows เป็นระบบปฏิบัติการที่ 'ปลอดภัย' มากในบางกรณีเพราะมันไม่ยอมให้คุณทำ อาจบัฟเฟอร์ไฟล์ในลักษณะเดียวกับที่ Linux ทำ แต่ยังเพิ่มการล็อกไฟล์เพื่อป้องกันคุณหรือโปรแกรมอื่น ๆ จากการแก้ไขไฟล์ที่คุณกำลังทำงานหรือดูอยู่ สิ่งนี้จะช่วยป้องกันไม่ให้ไฟล์นั้นเสียหายและป้องกันไม่ให้คุณหรือโปรแกรมอื่น ๆ เขียนทับการเปลี่ยนแปลงของกันและกัน


คุณลบไม่ได้จริงๆมันได้ เพียงแค่เลื่อนไปมาและเปลี่ยนชื่อ
Daniel Beck

2
คุณสามารถ 'rm' ได้ มันใกล้พอที่จะลบมันแล้ว
Chris Moore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.