qinghuan
← 回到知识探索

计算机趣闻 / 趣味知识

文件点了删除,原来的字节就立刻被擦掉了吗?

在内存里搭一个虚构文件柜,分开观察名字、内容和可再次使用的空间。

展开本文目录
  1. 把三件事拆开:名字、内容、空间归属
  2. 回收站、解除引用和覆写,也要分开
  3. 一个只存在于程序内存的文件柜
  4. SSD 还会接到“这些区域不用了”的通知
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 会运行一小段 Python,认识字符串、列表和条件判断即可
遇到不熟悉的词,先看这 1 个解释
磁盘
日常使用中的磁盘通常指保存系统、应用和文件的硬盘类设备,包括机械硬盘和固态硬盘。与普通运行内存不同,它们不需要持续供电来维持已经写入的数据。
打开完整术语小抄 ↗

一段大视频复制进去要等很久,删除却可能很快。一个原因是“从文件列表移除它”和“把每一处原始内容都重写”不是同一种操作。删除首先改变你还能否通过那个名字访问文件,以及存储空间是否可以再被利用。

但这也绝不意味着“删了的文件总能找回来”。硬件、文件系统和后台处理方式不同,结果也不同。下面只用内存里的虚构格子解释概念,不扫描磁盘,不操作回收站,也不尝试恢复任何真实文件。

把三件事拆开:名字、内容、空间归属

可以把文件目录想成一张索引表,记录名字对应哪些存储位置;内容放在另外的格子里;还有一份记录标明哪些格子能重新分配。删掉索引项并宣布格子可用,不必在同一刻把每个格子的旧值改成零。

这只是便于理解的简化图。以 GNU/Linux 的 unlink 语义为例,移除的是一个名字;文件还有其他硬链接名字,或者仍被进程打开时,后续处理并不等同于“立刻收回所有空间”。Windows 等系统的具体规则需要另看文档,不能把一个模型说成全部实现。

回收站、解除引用和覆写,也要分开

图形界面中的删除还可能先把文件交给回收站保留。清空回收站之后,也不能仅凭界面消失就断言存储介质上的所有副本已经清除。这里需要区分用户界面、文件系统记录和设备实际如何存放数据。

下面把“解除引用”和“复用格子”刻意写成两步。第一步以后旧文字仍在我们的列表中,只是名字不再指向它;第二步用新内容占了其中一个格子,原来的整份内容就不再完整。这是人为安排的演示,不是测量真实硬盘会保留多久。

一个只存在于程序内存的文件柜

字典 directory 保存虚构文件名及格子编号,列表 blocks 保存两个片段,集合 free 保存可用格子。示例只有自己写在代码里的字母。它没有打开任何文件,也没有调用文件删除或磁盘读取功能。

观察每次打印时究竟变了什么。名字消失、空间可用、旧内容消失是三项不同观察。真实系统可能把其中一些步骤合并、推迟或交给设备执行,本实验不能据此判断某台电脑上的数据是否还可读取。

小实验 · python
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 和设备管理使“删除后总能恢复”同样不成立。

别把例子用过头

  • 内存格子模型不能预测真实设备的保留时间或恢复成功率。
  • 单个文件的处理结果不涵盖快照、备份及其他副本。

自己试一小步

给虚构文件柜加第二个名字,解释删除其中一个名字应发生什么。

  1. 让两个虚构名字指向同一组格子,只在内存中操作。
  2. 删除第一个名字后,检查另一个名字是否仍需要这些格子。
  3. 在模型说明中列出没有实现的真实机制,例如打开文件引用或设备回收。

做到这些,就算完成

  • 仍有名字使用的格子没有被错误宣布为空闲。
  • 区分模型操作与真实系统调用,不碰实际磁盘。
  • 结论没有承诺能恢复或已安全擦除任何真实数据。

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

  • Deleting Files (新标签页)↗GNU C Library · 英文

    支持 unlink 删除名字、硬链接与打开文件引用影响释放的具体语义。

    阅读 GNU C Library 的接口语义;文章明确不把它泛化成所有操作系统行为。

  • TRIM and Unmap hints (新标签页)↗Microsoft Learn · 英文

    支持删除时文件系统记录变化与设备 TRIM 通知的分工、SSD 不能按普通原地覆写模型理解。

    这是面向 Windows 8 / Server 2012 的历史 API 说明,只用于解释机制,不作为当前所有设备配置的断言。

  • SDelete:Introduction 与 How SDelete Works (新标签页)↗Microsoft Sysinternals / Mark Russinovich · 英文

    支持普通删除与覆写不同,以及某些文件属性会让逻辑写入重新分配存储。

    只读概念段;未下载或运行工具。正文包含较早 Windows 与磁介质背景,本篇不沿用其绝对恢复保证。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。