允许移动到回收站的最长文件路径是多少?

2024-01-17

对于我的应用程序,我正在测试允许移动到回收站的最长可用文件路径,并且我得到了有趣的结果。

在 Windows XP 上,最大大小为 259 个字符,这是MAX_PATH http://msdn.microsoft.com/en-us/library/cc249520.aspx常数负 1。

但在我的 Windows 8.1 Pro 上,允许的最大文件路径大小似乎是 215 个字符。

所以我很好奇有没有官方的指导方针?

EDIT:好的,由于下面的海报请求了 API,所以我正在使用SHFileOperation with FO_DELETE and FOF_ALLOWUNDO将用户的文件放入回收站。由于 Windows 资源管理器对其删除操作使用完全相同的 API,因此可以通过在 Windows 资源管理器中创建长路径然后尝试删除它来轻松测试它。在我的实验中,我可以看到以下内容:

  • 视窗XP,如果总路径长度为259个字符(在某些版本上,可能是257??),该文件/文件夹将被放入回收站。否则,Windows 资源管理器仅提供永久删除它的选项。

  • 视窗Vista,此限制为 217 个字符(含)。

  • Windows 7 和 8,包含 215 个字符。

所以看起来这个最大限制正在缩小......因此我只是好奇,MSDN 中是否有记录?


回收站内部结构:

视窗XP

每个驱动器都有自己的驱动器:\RECYCLER\%USER_SID% 目录。该目录包含所有已删除的文件,但文件的名称如下DcN.ext where 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 及以上版本

每个驱动器都有自己的驱动器:\$Recycle.Bin\%USER_SID% 目录。该目录包含所有已删除的文件,但现在没有数据库文件。每个删除的文件都与 RB 内的 2 个文件相关联。

第一个文件的名称类似于$INNNNNN.ext where $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 where $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 可以在回收站中存储任何路径的任何文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许移动到回收站的最长文件路径是多少? 的相关文章

随机推荐