在使用文件时移动文件-它如何工作?


31

我已经注意到,在非Windows操作系统上。...即linux / mac,我可以执行以下操作:-向目标发送zip给朋友-在传输文件时将其删除

并且传输不会失败。

或者,我可以执行以下操作:-开始播放电影-删除文件-电影仍可以播放完成(从磁盘读取,而不仅仅是缓存在内存中)

尽管文件已被“删除”,但是正如我所提到的,它们实际上已被移动到文件系统上的其他位置……即垃圾箱目录或其他内容。因此在我看来,操作系统似乎使用指针@该文件在移动时会更新,而不是直接访问文件。

谁能阐明该AWESOME功能的实际实现方式?我什至不知道该通过Google来了解更多信息。

谢谢。


1
从理论上讲,我认为可能有两种发生方式。两者都是现实。该文件在内存中。或者文件系统具有对文件的引用,而仅删除引用。两者都是现实。引用事实是取消删除程序可以如何删除内容。当所有程序关闭时,实际上删除了文件的想法听起来很废话。您可以查找链接列表(一种编程数据结构,以更深入地了解该概念)。或者,您可以查询特定的文件系统。
barlop 2011年

Answers:


29

目录条目只是指向索引节点的指针。索引节点包含有关文件的元信息(名称除外),以及指向文件数据的指针(如果有)。当您开始复制文件时,您将获得索引节点的句柄。

操作系统维护对索引节点的引用计数。只要存在对索引节点的引用,索引节点和文件的数据都会保留。一旦删除了对索引节点的所有引用,索引节点将被删除,文件所需的空间将被释放。

当您打开文件进行复制时,它将一直保留到您的进程关闭文件为止。这应该在文件传输完成时发生,并且在复制过程失败时发生。如果文件传输在部分途中失败,并且您删除了该文件的所有硬链接,则将无法成功地重新开始传输。

编辑:正如其他人指出的那样,在不移动数据的情况下完成了在同一设备上的文件移动。而是在目标目录中创建一个新目录条目,并删除原始目录条目。

同一文件可能有多个目录条目。这些称为硬链接。通过为文件创建新的目录条目而不删除原始条目来创建它们。文件系统的inode有一个引用计数,用于记录指向该文件的目录条目的数量。

EDIT2:如果进程崩溃或被终止,则文件将被干净地删除,因为内存访问计数将减少为零。这是程序正常结束时发生的动作。

如果发生电源故障或其他无序关闭系统,则磁盘需要先进行fsck(文件系统检查),然后才能完全装入磁盘。根据磁盘索引节点和目录结构的状态,空间将被恢复,文件将保留在目录中,或者将在目录中创建新条目lost+found。结果将取决于已将哪些更改刷新到磁盘或写入文件系统日志。


5
究竟。我自己不能把它更好。顺便说一句,如果您需要在程序中存储一些临时文件,通常的技巧是在中创建文件/tmp,然后立即创建文件unlink(2)。到那时,目录中没有文件(因此在退出或崩溃时无需清理),但是您的进程仍然可以访问该文件,并且没有其他进程会意外或故意将其弄乱。这说明了感兴趣的属性。
诺曼·格雷

这是否意味着,如果在程序使用某个打开的文件时将其删除并发生电源故障,则搁浅的数据将保留在驱动器占用空间上?如果使用该文件的进程崩溃或被杀死该怎么办?
詹森C

1
@JasonC我已经更新了答复以回答您的问题。
BillThor 2014年

6

正如Matt Jenkins解释的那样,操作系统(文件系统)跟踪由应用程序打开的文件。只要一个进程保持文件打开状态,它的数据就会保留在磁盘上(即使它已被删除并且不再对其他程序可见或不可访问)。

请注意,这样做的结果是,只有在使用文件的最后一个进程关闭文件后,该文件所占用的空间才能被回收。这是Linux / Unix文件系统操作的常见问题:“'df'命令说分区已满,而'du'报告可用空间”(请参阅​​例如http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html)。如果需要释放空间,仅删除大文件(例如,日志文件)是不够的,还必须确保没有任何进程使它们保持打开状态(通常是日志文件有问题)。


对于OS X / HFS +,情况并非如此:您可以将文件移动到“废纸rash”,但不能跨分区移动或删除它们(即清空废纸))。
丹尼尔·贝克

2

实际上,这很简单。该文件维护一个引用列表-正在访问该文件的进程。删除文件时,它只会从目录中删除列表,而不会删除文件本身。仍打开该文件的程序仍可以访问它。只有在访问该文件的所有程序都将其关闭时,该文件才会被实际删除。

同样,通过移动文件-如果它位于同一文件系统中-该文件实际上并没有那样移动,它只是将指针更改为文件所在的目录。


“文件维护引用列表”?
丹尼尔·贝克

应该是“ OS或Explorer”而不是文件。
摩押

2
那实际上就是文件系统。
JRobert

操作系统使用文件系统将引用存储在文件中(文件头结构中的nlinks)-在那里-我们都很高兴;)
Majenko 2011年

1
“引用”都是具有打开的文件句柄和指向文件的硬链接(包括第一个文件名)的过程。在参考计数变为零之前,数据块不会标记为空闲,并且可以重用。
mpez0 2011年

0

在UNIX文件系统中,文件可以具有一个或多个硬链接。只要至少有一个文件,该文件就存在。当最后一个被删除时,文件的空间被释放。上面的链接将为您提供更多阅读的起点-尤其请参见“链接计数器”部分。


1
是的,但这不是这里发生的事情。关键是,即使在删除最后一个硬链接之后,该文件仍会保留,直到所有进程都已关闭它们的句柄为止。
sleske 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.