![在使用时移动文件--它是如何工作的?](https://linux22.com/image/1266828/%E5%9C%A8%E4%BD%BF%E7%94%A8%E6%97%B6%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6--%E5%AE%83%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F.png)
我注意到在非 Windows 操作系统....即 Linux/Mac 上我可以执行以下操作:
- 通过 aim 向朋友发送 zip
- 在传输过程中删除文件
并且转移不会失败。
或者,我可以执行类似的操作..
- 开始看电影
- 删除文件
- 电影仍播放至完成(从磁盘读取,而不仅仅是在内存中缓冲)
尽管文件被“删除”,但正如我提到的,它们实际上被移动到了文件系统上的另一个位置……即垃圾目录或类似的东西。所以在我看来,操作系统使用了一个指针来指向文件,当文件移动时,指针会被更新,而不是直接访问文件。
有人能解释一下这个很棒的功能是如何实现的吗?我甚至不知道该用 Google 搜什么才能了解更多。
答案1
目录条目只是指向 inode 的指针。inode 包含有关文件的元信息(除名称外)和指向文件数据的指针(如果有)。当您开始复制文件时,您会获得 inode 的句柄。
操作系统会维护对 inode 的引用计数。只要对 inode 有引用,inode 和文件的数据就会保留。一旦删除了对 inode 的所有引用,inode 和文件所需的空间就会被释放。
由于您已打开文件进行复制,因此它将一直保留,直到您的进程关闭文件。这应该在文件传输完成时发生,并且如果复制过程失败也会发生。如果文件传输中途失败并且您已删除该文件的所有硬链接,则您将无法成功重新启动传输。
编辑:正如其他人所指出的,在同一设备上移动文件时不会移动数据。而是在目标目录中创建一个新的目录条目,并删除原始目录条目。
同一文件可以有多个目录条目。这些条目称为硬链接。它们是通过为文件创建新的目录条目而不删除原始条目而创建的。文件系统的 inode 具有引用计数,用于记录指向该文件的目录条目数。
EDIT2:如果进程崩溃或被终止,则文件将被彻底删除,因为内存访问计数将减少为零。这是程序正常结束时发生的操作。
如果发生电源故障或其他系统无序关闭,磁盘将需要进行fsck
(文件系统检查)才能完全挂载。根据磁盘上的 inode 和目录结构的状态,空间将被恢复,文件将保留在目录中,或者目录中将创建一个新条目lost+found
。结果将取决于哪些更改已刷新到磁盘或写入文件系统日志。
答案2
正如 Matt Jenkins 所解释的那样,操作系统(文件系统)会跟踪应用程序保持打开的文件。只要进程保持文件打开,其数据就会保留在磁盘上(即使该文件已被删除,其他程序不再可见或可访问)。
请注意,这样做的结果是,只有在最后一个使用文件的进程关闭文件后,文件所占用的空间才能被回收。这是 Linux/Unix 文件系统操作的常见问题解答:“‘df’ 命令表示分区已满,而‘du’ 则报告可用空间”(参见例如http://batleth.sapienti-sat.org/projects/FAQs/ext3-faq.html)。如果您需要释放空间,仅仅删除大文件(例如日志文件)是不够的,您还必须确保没有进程保持它们打开(通常是日志文件的问题)。
答案3
其实很简单。文件维护一个引用列表 - 访问该文件的进程。删除文件时,它只会从目录中删除列表,而不会删除文件本身。仍打开该文件的程序仍可访问它。只有当所有访问该文件的程序都关闭它时,该文件才会被真正删除。
此外,移动文件时 - 如果它在同一文件系统内 - 文件实际上并没有移动,它只是将指针更改为文件所在的目录。
答案4
在unix文件系统中,一个文件可以有一个或多个硬链接到它。只要至少有一个,文件就会存在。当最后一个被删除时,文件的空间就会被释放。上面的链接将为您提供更多阅读的起点 - 特别是请参阅“链接计数器”部分。