问题描述
在 Windows 中以编程方式将文件删除到回收站是一项微不足道的操作。
简而言之:只需将文件移动到
C:\$Recycle.Bin\SID\$R{name}
* (对于驱动器 C) 并创建一个关联的二进制文件 ($I{name}
),其中包含有关“已删除”文件/文件夹附近的元信息。
* 其中 SID 是您的操作系统安装标识符,类似于:S-1-5-21-1234567890-1234567890-1234567890-1001
。
但经过研究,我有两个问题:
信息文件结构如下(根据我的研究):
const buffer = new Uint8Array([
0x02,0x00,// Header
0xff,0xff,// Size // 65535 (bytes)
0x00,0x30,0xd7,0x01,// Deletion date (64-bit value)
0x0b,// Path string length // `11`
0x43,0x3a,// File path + \0 // `C:\1\1.txt` // `C:\\1\\1.txt\0`
0x5c,0x31,0x5c,0x2e,0x74,0x78,0x00
]);
标题(始终相同)、以字节为单位的文件大小(仅在文件资源管理器中可见)、64 位删除日期值、路径字符串长度和 UTF-16 编码空值终止的路径字符串。
唯一有问题的部分是日期。 它是如何编码的?
例如:
00 00 00 00 00 29 d7 01
是 2021.04.04 03:10
00 00 00 00 01 29 d7 01
是 2021.04.04 03:17
00 00 00 00 00 30 d7 01
是 2021.04.13 00:57
(前四个十六进制是 00
只是为了方便。)
例如:00 00 00 00 00 29 d7 01
是 132619794007457792
,但 new Date(132619794007457792/100000)
是 2012.01.10 12:19:00
。
我需要将 00 00 00 00 00 29 d7 01
字节转换为 2021.04.04 03:10
。
C:\$Recycle.Bin\SID\
中“已删除”的文件的名称以 $R
+ [A-Z0-9]{7}
+ 可选的 .{extension}
开头。
例如:$RL6JQMF.txt
。
以及相关的元数据文件:$IL6JQMF.txt
以 $I
开头。
事实上,例如,它适用于 $R___
+ $I___
和 $R123456789 abc
+ $I123456789 abc
。所以,我认为它只是随机生成的。
仅需要 $R
/$I
。该扩展程序仅用于在文件资源管理器中显示相应的图标。
解决方法
好的,我知道了。
虽然
00 00 00 00 00 00 00 00
是 1899.12.30 00:00
,
但是 00 00 00 00 00 00 01 00
是 1601.11.22 18:44
,
所以这个时间戳是自 1601.01.01 以来的 100 纳秒间隔数。
例如,对于 00 00 00 00 00 29 d7 01
(132619794007457792
),我得到正确的日期 (2021.04.04 03:10
),如文件资源管理器中所示:
new Date(132619794007457792 / 10000 + Number(new Date("1601.01.01 Z")))
无论如何,我认为这个话题对人们有用。
奇怪的是,在 2021 年我没有找到任何关于 Windows 中回收站如何工作的信息。