更改日记记录

当添加、删除和修改文件、目录和其他 NTFS 文件系统对象时,NTFS 文件系统在流中输入更改日记记录,为计算机上的每个卷输入一个。 每个记录指示更改的类型和对象已更改。 特定记录流开头的偏移量称为特定记录的更新序列号(USN)。 新记录将追加到流的末尾。

NTFS 文件系统可能会删除旧记录以节省空间。 如果需要的记录已被删除,索引服务会通过重新为卷编制索引来恢复,就像没有更改日志存在时一样。

更改日志仅记录对文件的更改的事实以及更改的原因(例如,写入作、截断、延长、删除等)。 它没有记录足够的信息来允许撤销更改。

此外,对同一文件的多个更改可能会导致将一个原因标志添加到当前记录。 如果多次发生同一类型的更改,则 NTFS 文件系统不会在第一次之后为更改写入新记录。 例如,几个没有干预关闭和重新打开作的写入作只导致一个更改记录,原因标志USN_REASON_DATA_OVERWRITE设置。

为了说明更改日志的工作原理,假设用户按以下顺序访问文件:

  1. 写入文件。
  2. 设置文件的时间戳。
  3. 写入文件。
  4. 截断文件。
  5. 写入文件。
  6. 关闭文件。

在这种情况下,NTFS 文件系统在更改日志中执行以下作(其中 | 指示按位 OR作)。

事件 NTFS 文件系统作
初始写入作
NTFS 文件系统会写入一个新的 USN 记录,并设置了USN_REASON_DATA_OVERWRITE原因标志。 有关可能的原因标志的详细信息,请参阅 USN_RECORD 结构。
设置文件时间戳
NTFS 文件系统使用标志设置USN_REASON_DATA_OVERWRITE写入新的 USN 记录 |USN_REASON_BASIC_INFO_CHANGE。
第二个写入作
NTFS 文件系统不会写入新的 USN 记录。 由于已为现有记录设置USN_REASON_DATA_OVERWRITE,因此不会对记录进行更改。
文件截断
NTFS 文件系统使用标志设置USN_REASON_DATA_OVERWRITE写入新的 USN 记录 |USN_REASON_BASIC_INFO_CHANGE |USN_REASON_DATA_TRUNCATION。
第三个写入作
NTFS 文件系统不会写入新的 USN 记录。 由于已为现有记录设置USN_REASON_DATA_OVERWRITE,因此不会对记录进行更改。
关闭作
如果用户进行更改是文件的唯一用户,则 NTFS 文件系统将写入具有以下标志设置的新 USN 记录:USN_REASON_DATA_OVERWRITE |USN_REASON_BASIC_INFO_CHANGE |USN_REASON_DATA_TRUNCATION |USN_REASON_CLOSE。

更改日志在文件的第一个打开和最后一个结束之间累积了一系列记录。 每个记录都有一个新的原因标志集,指示发生了新类型的更改。 记录序列提供文件的部分历史记录。 文件关闭时创建的最终记录会添加USN_REASON_CLOSE标志。 此记录表示对文件的更改的摘要,但与之前的记录不同,不指示更改的顺序。

要访问和更改文件的下一个用户生成具有单个原因标志的新 USN 记录。