การย้ายไฟล์ขณะที่ใช้งานอยู่ - ทำงานอย่างไร?


31

ฉันสังเกตเห็นว่าในระบบปฏิบัติการที่ไม่ใช่ windows .... เช่น linux / mac ฉันสามารถทำสิ่งต่าง ๆ เช่น: - ส่งซิปไปให้เพื่อนที่มีเป้าหมายมากกว่า - ลบไฟล์ในขณะที่มันกำลังถ่ายโอน

และการถ่ายโอนไม่ล้มเหลว

หรือฉันสามารถดำเนินการเช่น .. - เริ่มภาพยนตร์ - ลบไฟล์ - ภาพยนตร์ยังคงเล่นจนจบ (อ่านจากดิสก์ไม่ใช่แค่บัฟเฟอร์ในหน่วยความจำ)

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

มีใครบ้างที่เล่าให้ฟังว่าการใช้ความสามารถที่น่ากลัวนี้ได้ถูกนำไปใช้จริงหรือไม่? ฉันไม่แน่ใจด้วยซ้ำว่าจะให้ google เรียนรู้อะไรเพิ่มเติม

ขอขอบคุณ.


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

คำตอบ:


29

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

ระบบปฏิบัติการรักษาจำนวนการอ้างอิงไปยังไอโหนด ตราบใดที่มีการอ้างอิงถึง inode ข้อมูล inode และไฟล์จะถูกเก็บไว้ เมื่อการอ้างอิงทั้งหมดไปยัง inode ถูกลบออก inode นั้นและพื้นที่ที่ไฟล์ต้องการนั้นจะถูกปล่อยออกมา

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

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

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

EDIT2: หากกระบวนการขัดข้องหรือถูกฆ่าไฟล์จะถูกลบอย่างหมดจดเนื่องจากจำนวนหน่วยความจำที่เข้าถึงจะลดลงเหลือศูนย์ นี่คือการกระทำที่เกิดขึ้นเมื่อโปรแกรมสิ้นสุดลงตามปกติ

ในกรณีที่ไฟฟ้าขัดข้องหรือปิดระบบไม่เป็นระเบียบอื่น ๆ ดิสก์จะต้องมีfsck(การตรวจสอบระบบไฟล์) ก่อนที่จะสามารถติดตั้งได้อย่างสมบูรณ์ ขึ้นอยู่กับสถานะของ inode บนดิสก์และโครงสร้างไดเรกทอรีพื้นที่จะถูกกู้คืนไฟล์จะยังคงอยู่ในไดเรกทอรีหรือรายการใหม่จะถูกสร้างขึ้นในlost+foundไดเรกทอรี ผลลัพธ์จะขึ้นอยู่กับการเปลี่ยนแปลงที่ถูกฟลัชไปที่ดิสก์หรือเขียนลงในเจอร์นัลของระบบไฟล์


5
เผง ฉันไม่สามารถทำให้ดีขึ้นได้ อนึ่งเคล็ดลับทั่วไปหากคุณต้องการจัดเก็บไฟล์รอยขีดข่วนบางภายในโปรแกรมคือการสร้างไฟล์ใน/tmpและทันทีที่unlink(2)มัน ณ จุดนั้นไม่มีไฟล์อยู่ในไดเรกทอรี (ดังนั้นไม่มีอะไรให้ล้างข้อมูลที่ exit หรือ crash) แต่กระบวนการของคุณยังคงสามารถเข้าถึงไฟล์ได้และไม่มีกระบวนการอื่นใดที่สามารถทำโดยบังเอิญหรือจงใจยุ่งกับมัน ที่แสดงให้เห็นถึงทรัพย์สินที่น่าสนใจ
Norman Grey

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

1
@JasonC ฉันได้อัปเดตคำตอบเพื่อตอบคำถามของคุณแล้ว
BillThor

6

ตามที่อธิบายโดย Matt Jenkins, OS (ระบบไฟล์) ติดตามไฟล์ที่ถูกเปิดไว้โดยแอพพลิเคชั่น ตราบใดที่กระบวนการยังคงเปิดไฟล์ข้อมูลของมันจะยังคงอยู่บนดิสก์ (แม้ว่ามันจะถูกลบไปแล้วและจะไม่สามารถมองเห็นหรือเข้าถึงได้โดยโปรแกรมอื่น ๆ

โปรดทราบว่าผลลัพธ์ของสิ่งนี้คือพื้นที่ที่ไฟล์ครอบครองสามารถเรียกคืนได้เมื่อกระบวนการสุดท้ายที่ใช้มันถูกปิด นั่นเป็นคำถามที่พบบ่อยสำหรับการทำงานของระบบไฟล์ Linux / Unix: คำสั่ง "'df' กล่าวว่าพาร์ติชันเต็มขณะที่ 'du' รายงานพื้นที่ว่าง" (ดูตัวอย่างเช่นhttp://batleth.sapienti-sat.org/projects/FAQs/ext3-) faq.html ) หากคุณต้องการเพิ่มพื้นที่ว่างก็ไม่เพียงพอที่จะลบไฟล์ขนาดใหญ่ (เช่นไฟล์บันทึก) คุณต้องตรวจสอบให้แน่ใจว่าไม่มีกระบวนการใดเปิดไว้ (โดยทั่วไปจะเป็นปัญหากับไฟล์บันทึก)


ไม่เป็นความจริงในกรณีของ OS X / HFS +: คุณสามารถย้ายไฟล์เช่นไปที่ถังขยะ แต่ไม่สามารถข้ามพาร์ติชันหรือลบออก (เช่นการล้างถังขยะ)
Daniel Beck

2

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

นอกจากนี้การย้ายไฟล์ - หากอยู่ในระบบไฟล์เดียวกัน - ไฟล์ไม่ย้ายตามจริงมันแค่เปลี่ยนพอยน์เตอร์ไปยังไดเร็กตอรี่ที่ไฟล์นั้นอยู่.


"ไฟล์เก็บรักษารายการอ้างอิง" หรือไม่
Daniel Beck

ไม่ควรเป็นไฟล์ "OS หรือ Explorer"
Moab

2
ที่จริงแล้วจะเป็นระบบไฟล์
JRobert

ระบบปฏิบัติการใช้ระบบไฟล์เพื่อจัดเก็บการอ้างอิงในไฟล์ (ลิงก์ในโครงสร้างส่วนหัวของไฟล์) - ที่นั่น - เราทุกคนมีความสุข;)
Majenko

1
"การอ้างอิง" เป็นกระบวนการทั้งสองที่มีจุดจับเปิดไฟล์และฮาร์ดลิงก์ (รวมถึงชื่อไฟล์แรก) ไปยังไฟล์ บล็อกข้อมูลไม่ได้ถูกทำเครื่องหมายว่าว่างและสามารถนำมาใช้ซ้ำได้จนกว่าจำนวนการอ้างอิงจะเป็นศูนย์
mpez0

0

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


1
จริง แต่นั่นไม่ใช่สิ่งที่เกิดขึ้นที่นี่ ประเด็นก็คือว่าแม้หลังจากลบฮาร์ดลิงก์สุดท้ายแล้วไฟล์จะยังคงอยู่จนกว่า pocesses ทั้งหมดจะปิดที่จับของพวกเขา
sleske
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.