开始前,会这些就够了
- 会运行一小段 Python,认识字符串、列表和条件判断即可
一段大视频复制进去要等很久,删除却可能很快。一个原因是“从文件列表移除它”和“把每一处原始内容都重写”不是同一种操作。删除首先改变你还能否通过那个名字访问文件,以及存储空间是否可以再被利用。
但这也绝不意味着“删了的文件总能找回来”。硬件、文件系统和后台处理方式不同,结果也不同。下面只用内存里的虚构格子解释概念,不扫描磁盘,不操作回收站,也不尝试恢复任何真实文件。
把三件事拆开:名字、内容、空间归属
可以把文件目录想成一张索引表,记录名字对应哪些存储位置;内容放在另外的格子里;还有一份记录标明哪些格子能重新分配。删掉索引项并宣布格子可用,不必在同一刻把每个格子的旧值改成零。
这只是便于理解的简化图。以 GNU/Linux 的 unlink 语义为例,移除的是一个名字;文件还有其他硬链接名字,或者仍被进程打开时,后续处理并不等同于“立刻收回所有空间”。Windows 等系统的具体规则需要另看文档,不能把一个模型说成全部实现。
回收站、解除引用和覆写,也要分开
图形界面中的删除还可能先把文件交给回收站保留。清空回收站之后,也不能仅凭界面消失就断言存储介质上的所有副本已经清除。这里需要区分用户界面、文件系统记录和设备实际如何存放数据。
下面把“解除引用”和“复用格子”刻意写成两步。第一步以后旧文字仍在我们的列表中,只是名字不再指向它;第二步用新内容占了其中一个格子,原来的整份内容就不再完整。这是人为安排的演示,不是测量真实硬盘会保留多久。
一个只存在于程序内存的文件柜
字典 directory 保存虚构文件名及格子编号,列表 blocks 保存两个片段,集合 free 保存可用格子。示例只有自己写在代码里的字母。它没有打开任何文件,也没有调用文件删除或磁盘读取功能。
观察每次打印时究竟变了什么。名字消失、空间可用、旧内容消失是三项不同观察。真实系统可能把其中一些步骤合并、推迟或交给设备执行,本实验不能据此判断某台电脑上的数据是否还可读取。
blocks = ["OLD-A", "OLD-B", "...."]
directory = {"demo.txt": [0, 1]}
free = {2}
old_positions = directory.pop("demo.txt")
free.update(old_positions)
print("name_present", "demo.txt" in directory)
print("reusable", sorted(free))
print("old_cells", blocks[:2])
blocks[0] = "NEW-A"
free.remove(0)
directory["new.txt"] = [0]
print("after_reuse", blocks[:2])怎样运行:保存为 delete_model_demo.py,在一个自己的练习目录中运行 python delete_model_demo.py。使用 Python 3.9 或更高版本,仅用标准库。
运行后对照结果
name_present False
reusable [0, 1, 2]
old_cells ['OLD-A', 'OLD-B']
after_reuse ['NEW-A', 'OLD-B']SSD 还会接到“这些区域不用了”的通知
SSD 内部的闪存管理与一排可直接覆写的普通格子不同。TRIM 这类通知可告诉设备某些区域已不再需要,设备据此安排回收等工作。因此,即使应用没有逐字节写零,也不能保证后来还能按原方式读到原内容。
反过来,在逻辑地址写了新内容,也不自动证明设备内部、快照或备份中的所有旧副本都消失了。严肃的数据清除需要结合介质、系统和副本范围确定方案。本篇不提供擦盘命令;它只帮助读懂一个边界:界面上的“删除完成”,与所有位置的内容被覆写,不是同一项证明。
记住这三点
- 文件名消失、空间可复用和内容被覆写,是不同层面的事情。
- 回收站还原与从底层残留重建文件,不是同一流程。
- SSD 的 TRIM 和设备管理使“删除后总能恢复”同样不成立。
别把例子用过头
- 内存格子模型不能预测真实设备的保留时间或恢复成功率。
- 单个文件的处理结果不涵盖快照、备份及其他副本。
自己试一小步
给虚构文件柜加第二个名字,解释删除其中一个名字应发生什么。
- 让两个虚构名字指向同一组格子,只在内存中操作。
- 删除第一个名字后,检查另一个名字是否仍需要这些格子。
- 在模型说明中列出没有实现的真实机制,例如打开文件引用或设备回收。
做到这些,就算完成
- 仍有名字使用的格子没有被错误宣布为空闲。
- 区分模型操作与真实系统调用,不碰实际磁盘。
- 结论没有承诺能恢复或已安全擦除任何真实数据。
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- Deleting Files (新标签页)↗
支持 unlink 删除名字、硬链接与打开文件引用影响释放的具体语义。
- TRIM and Unmap hints (新标签页)↗
支持删除时文件系统记录变化与设备 TRIM 通知的分工、SSD 不能按普通原地覆写模型理解。
- SDelete:Introduction 与 How SDelete Works (新标签页)↗
支持普通删除与覆写不同,以及某些文件属性会让逻辑写入重新分配存储。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
操作系统原理 (新标签页)↗
只读“文件系统 API (1)”里的目录与硬链接说明,用图表示多个名字怎样指向同一文件,先不做磁盘恢复实验。
查看学习准备与访问说明 →