回收站内部:
Windows XP
每个驱动器都有自己的drive:\RECYCLER\%USER_SID%目录。该目录包含所有已删除的文件,但文件名为DcN.ext,其中D是名称固定部分,c是驱动器字母,N是索引,ext是原始文件的扩展名。除了已删除的文件外,还有一个名为INFO2的数据库文件。
INFO2文件以标题开头。标题结构如下:
Offset Type Value
0x0000 DWORD Signature ; Always 5
0x0004 DWORD Unknown1
0x0008 DWORD Unknown2
0x000C DWORD RecordSize ; Always 0x00000320
0x0010 DWORD Unknown3
记录紧随头文件存储,直到INFO2文件结束。记录结构如下:
Offset Type Value
0x0000 ANSICHAR[MAX_PATH] OriginalFileNameA ; Ansi string
0x0104 DWORD Index ; Associated with *N* from *DcN.ext*
0x0108 DWORD DriveIndex ; A: = 0; B: = 1; C: = 2; ...
0x010C FILETIME DeleteFileTime
0x0114 DWORD OriginalFileNamePhysicalSize
0x0118 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
Windows Vista及以上版本
每个驱动器都有自己的drive:\$Recycle.Bin\%USER_SID%目录。该目录包含所有已删除的文件,但现在没有数据库文件。每个已删除的文件与RB内的2个文件相关联。
第一个文件的名称类似于$INNNNNN.ext,其中$I是名称的固定部分,NNNNNN由6个随机字母或数字组成,ext是原始文件的扩展名。
$I文件结构:
Offset Type Value
0x0000 DWORD Signature ; Always 1
0x0004 DWORD Unknown1
0x0008 DDWORD OriginalFileSize
0x0010 FILETIME DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
第二个文件的名称类似于
$RNNNNNN.ext,其中
$R是名称的固定部分,
NNNNNN与$I文件中相同,而
ext是原始文件的扩展名。$R文件是被删除的文件本身。
正如您所看到的,在所有情况下,Windows将文件名存储在大小为MAX_PATH个字符的数组中。因此,文件名长度的限制为MAX_PATH-1个字符。
Windows 10
Windows 10具有新版本的$I文件结构(不知道哪个更新更改了它):
Offset Type Value
0x0000 DWORD Signature ; Always 2
0x0004 DWORD Unknown1
0x0008 DDWORD OriginalFileSize
0x0010 FILETIME DeleteFileTime
0x0018 DWORD OriginalFileNameLen
0x001C WIDECHAR[OriginalFileNameLen] OriginalFileNameW ; Wide string
看起来现在Windows可以将任何路径下的文件存储到回收站中。
FO_DELETE
和FOF_ALLOWUNDO
的SHFileOperation
。对于较长的文件路径,如果它们以\\.\
开头,则是可以的,但Windows资源管理器和SHFileOperation
不支持它。 - c00000fd