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

对于我的应用程序,我正在testing最长的可用文件path,以允许将其移动到回收站中,并获得有趣的结果。

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

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

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

编辑:好吧,因为下面的海报要求一个API,我用FO_DELETEFOF_ALLOWUNDO SHFileOperation将用户的文件放入回收站。 由于Windows资源pipe理器为其删除操作使用相同的确切API,因此可以通过在Windows资源pipe理器中创build一个长path,然后尝试删除它来轻松进行testing。 在我的实验中,我可以看到以下内容:

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

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

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

所以看起来这个最大的限制正在缩小…因此,我只是好奇,如果这是logging在MSDN的某处?

回收站内部:

Windows XP

每个驱动器都有自己的驱动器:\ 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及更高版本

每个驱动器都有自己的驱动器:\ $ 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 OriginalFileNameSize 0x0010 FILETIME DeleteFileTime 0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string 

第二个文件的名称如$ RNNNNNN.ext ,其中$ R是名称的固定部分, NNNNNN与$ I文件中的相同, ext是原始文件的扩展名。 $ R文件被删除文件本身。

正如你在任何情况下看到的,Windows将filename存储在数组中,其大小为MAX_PATH字符。 那为什么filename的长度限制是MAX_PATH – 1个字符

简单的答案。 回收站是磁盘上(好)隐藏的文件夹。 其中的所有文件保持原来的名称,加上再循环的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

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