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



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

在Windows XP中,最大长度为259个字符,即MAX_PATH常量减去1。

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

所以我很好奇这有什么官方的指导方针吗?

EDIT: OK,因为下面的海报要求API,我使用SHFileOperationFO_DELETEFOF_ALLOWUNDO将用户的文件放入回收站。由于Windows资源管理器使用相同的API来进行删除操作,所以很容易通过在Windows资源管理器中创建一个长路径然后尝试删除它来测试它。在我的实验中,我可以看到以下内容:

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

  • Windows Vista,这个限制是217个字符,包括

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

所以看起来这个最大值在缩小…因此,我只是好奇,如果这是记录在MSDN的某个地方?

回收站内部:

Windows XP

每个驱动器都有自己的驱动器:RECYCLER%USER_SID%目录。此目录包含所有已删除的文件,但文件的名称如DcN。ext其中D是名称的固定部分,c是驱动器号,N是索引,ext是原始文件的扩展名。除已删除的文件外,还有名为INFO2的数据库文件。

INFO2文件以header开头。头结构:

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其中$I是名称的固定部分,NNNNNN由6个随机字母或数字组成,ext是原始文件的扩展名。

文件结构:

Offset Type               Value
0x0000 DWORD              Signature         ; Always 1
0x0004 DWORD              Unknown1
0x0008 DDWORD             OriginalFileSize
0x0010 FILETIME           DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string

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

答案很简单。回收站是磁盘上的一个隐藏文件夹。其中的所有文件都保留其原始名称,加上回收站文件夹名称的额外长度。

在Windows XP中,路径是这样的:

C: 回收商 s - 1 - 5 - 21 - 1089551744 - 1120685985 - 1089551744 - 1003

我相信在以后的版本中是类似的,但可能会变得更长。你的文件名必须在这个结尾,并且仍然保持在260的限制内。


那么如何为一个特定的系统找到那个名称呢?试试GetFinalPathnameByHandle,或者这个博客。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364962.aspx

http://pdh11.blogspot.com.au/2009/05/pathcanonicalize-versus-what-it-says-on.html


更多有用的地方。

IKnownFolder: http://msdn.microsoft.com/en-us/library/windows/desktop/bb776912.aspx

SHGetKnownFolderPath: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx

SHGetFolderPath使用CSIDL: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx

相关内容

  • 没有找到相关文章

最新更新