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

时间:2014-05-29 05:13:01

标签: windows winapi windows-shell windows-explorer

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

在Windows XP上,最大大小为259个字符,即MAX_PATH常量减去1。

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

所以我很好奇是否有任何官方指导原则?

编辑:好的,因为以下海报要求提供API,我使用SHFileOperationFO_DELETEFOF_ALLOWUNDO放置用户&#39 ; s文件进入回收站。由于Windows资源管理器使用与删除操作完全相同的API,因此可以通过在Windows资源管理器中创建长路径然后尝试删除它来轻松测试它。在我的实验中,我可以看到以下内容:

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

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

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

所以看起来这个最大限制正在缩小......所以我只是好奇,如果在MSDN的某个地方记录这个?

2 个答案:

答案 0 :(得分:8)

回收站内幕:

Windows XP

每个驱动器都有自己的驱动器:\ RECYCLER \%USER_SID%目录。此目录包含所有已删除的文件,但文件的名称类似于 DcN.ext ,其中 D 是固定的名称的一部分, c 是驱动器号,< em> 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 ,其中 $ 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 与$中的相同我的文件和 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可以存储回收站中包含任何路径的任何文件。

答案 1 :(得分:0)

简单的回答。回收站是磁盘上的(井)隐藏文件夹。其中的所有文件都保留其原始名称,以及回收bin文件夹名称的额外长度。

在Windows XP中,路径如下所示:

  

C:\ RECYCLER \ S-1-5-21-1089551744-1120685985-1162132538-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

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