文件创建时间即使在删除后也不会更改



我正在使用以下代码:

from datetime import datetime
import time, pandas as pd, os, pickle
df = pd.DataFrame(np.arange(1,200))
fn = r'C:z1.p'
pickle.dump(df, open(fn, 'wb'))
print(datetime.fromtimestamp(os.stat(fn).st_ctime)) 
os.remove(fn)
time.sleep(5)
pickle.dump(df, open(fn, 'wb'))
print(datetime.fromtimestamp(os.stat(fn).st_ctime))

但我从两个打印语句中获得的创建时间相同:

2022-03-16 08:43:30.885011
2022-03-16 08:43:30.885011

如何确保为第二次打印对账单打印新时间?

这是Windows的一个功能,称为"文件系统隧道传输";。

文件系统隧道的伪造历史

您可能会惊讶的文件系统功能之一是隧道,其中文件取自以前存在于目录中的文件。换言之,如果您删除一些文件"file with long name.txt"并然后创建一个具有相同名称的新文件,该新文件将具有与原始文件相同的短名称和相同的创建时间。你可以阅读这篇KB文章,了解有关哪些操作是敏感的详细信息隧道开挖。

为什么隧道会存在?

当您使用程序编辑现有文件,然后保存它时期望保留原始创建时间戳,因为您编辑文件,而不是创建新文件。但在内部,许多项目通过组合执行保存、删除和重命名来保存文件操作(如链接文章中列出的操作(,以及如果没有隧道,文件的创建时间似乎会发生变化即使从最终用户的角度来看,也没有创建任何文件。

查看此存档的Windows NT副本包含文件系统隧道功能:

从目录中删除名称(重命名或删除(时短/长名称对和创建时间保存在缓存中,由键控已删除的名称。将名称添加到目录时(重命名或创建(,则搜索缓存以查看是否有信息恢复缓存对目录的每个实例都有效。如果目录被删除,其缓存被删除。

这些成对的操作可以引起"隧道"上的隧道;名称">

  • 删除(名称(/创建(名称(
  • delete(name(/rename(source,name(
  • rename(name,newname(/create(name(
  • rename(name,newname(/rename(source,name(

这个想法是模仿MS-DOS程序在使用时所期望的行为安全保存方法。他们将修改后的数据复制到临时文件中,删除原始文件并将临时文件重命名为原始文件。这完成时应看起来是原始文件。Windows执行在FAT和NTFS文件系统上进行隧道传输以确保长/短文件当16位应用程序执行此安全保存时,名称将被保留活动

与文件隧道相关的一个Windows函数是FltGetTunneledName():

FltGetTunneledName例程检索文件的隧道名称,给定先前调用FltGetFileNameInformation、FltGetFileNameInformationUnsafe或FltGetDestinationFileNameInformation为文件返回的规范化名称。

禁用隧道传输:

  1. 打开regedit

  2. 导航到此处:

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem

  3. 在编辑菜单上,指向新建,然后单击DWORD Value

  4. 键入MaximumTunnelEntries,然后按Enter

  5. 在编辑菜单上,单击修改

  6. 键入0,然后单击确定

  7. 重新启动计算机

  8. 完成

最新更新