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

Windows 允许移动到回收站的最长文件路径是什么?,windows,winapi,windows-shell,windows-explorer,Windows,Winapi,Windows Shell,Windows Explorer,对于我的应用程序,我正在测试允许移动到回收站的最长可用文件路径,并且得到了有趣的结果 在Windows XP上,最大大小为259个字符,即常量减去1 但在我的Windows 8.1 Pro上,允许的最大文件路径大小似乎是215个字符 所以我很好奇有没有官方的指导方针 编辑:好的,因为下面的海报要求API,我正在使用SHFileOperation和fou DELETE和FOF_ALLOWUNDO将用户文件放入回收站。由于Windows资源管理器在其删除操作中使用相同的API,因此通过在Window

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

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

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

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

编辑:好的,因为下面的海报要求API,我正在使用
SHFileOperation
fou DELETE
FOF_ALLOWUNDO
将用户文件放入回收站。由于Windows资源管理器在其删除操作中使用相同的API,因此通过在Windows资源管理器中创建一个长路径,然后尝试删除它,可以轻松地对其进行测试。在我的实验中,我可以看到以下几点:

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

  • Windows Vista,此限制为217个字符(含)

  • Windows 7和8,总共215个字符


所以这个最大限度似乎在缩小。。。因此,我只是好奇,这是否在MSDN的某个地方有记录?

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

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

C:\RECYCLER\S-1-5-21-1089551744-1120685985-116212538-1003\

我相信它在以后的版本中是类似的,但可能会越来越长。你的文件名必须在最后继续,并且仍然保持在260的限制之内


那么,如何找到特定系统的名称呢?请尝试GetFinalPathnameByHandle或此博客


更有用的地方看看

IKnownFolder:

SHGetKnownFolderPath:

使用CSIDL的SHGetFolderPath:

回收站内部:

Windows XP

每个驱动器都有自己的驱动器:\RECYCLER\%USER\u 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
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
Offset Type               Value
0x0000 DWORD              Signature         ; Always 1
0x0004 DWORD              Unknown1
0x0008 DDWORD             OriginalFileSize
0x0010 FILETIME           DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
记录在头文件之后立即连续存储到INFO2文件的末尾。记录结构:

Offset Type  Value
0x0000 DWORD Signature  ; Always 5
0x0004 DWORD Unknown1
0x0008 DWORD Unknown2
0x000C DWORD RecordSize ; Always 0x00000320
0x0010 DWORD Unknown3
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
Offset Type               Value
0x0000 DWORD              Signature         ; Always 1
0x0004 DWORD              Unknown1
0x0008 DDWORD             OriginalFileSize
0x0010 FILETIME           DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
Windows Vista及以上版本

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

第一个文件的名称类似于$innnnn.ext,其中$I是名称的固定部分,NNNNNN由6个随机字母或数字组成,ext是原始文件的扩展名

$I文件结构:

Offset Type  Value
0x0000 DWORD Signature  ; Always 5
0x0004 DWORD Unknown1
0x0008 DWORD Unknown2
0x000C DWORD RecordSize ; Always 0x00000320
0x0010 DWORD Unknown3
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
Offset Type               Value
0x0000 DWORD              Signature         ; Always 1
0x0004 DWORD              Unknown1
0x0008 DDWORD             OriginalFileSize
0x0010 FILETIME           DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
第二个文件的名称类似于$rnnnn.ext,其中$R是名称的固定部分,NNNNNN与$I文件中的相同,ext是原始文件的扩展名$R文件是删除的文件本身

正如您所看到的,在所有情况下,Windows都将文件名存储在大小为MAX_PATH chars的数组中这就是为什么文件名的长度限制为MAX_PATH-1个字符的原因

Windows 10

Windows 10有一个新版本的$I文件结构(不知道是什么更新改变了它):


现在看来Windows可以在回收站中存储任何路径的文件。

这个问题属于@Spook:为什么?这是一个编程问题。是的,在大多数情况下,它可能属于这两者,尽管我不确定用户为什么会真正关心这一点。对我来说,这绝对是一个编程问题(属于这里)。也是一个好的+1IRC“允许的最长[总]路径”大于MAX_path:ref和(请参阅扩展长度路径:“Windows API有许多函数,也有Unicode版本,允许扩展长度路径的最大总路径长度为32767个字符)。@c00000fd否,不是。这是一个关于Windows文件系统,特别是NTFS的问题。哈有趣。谢谢你的意见。现在有道理了。只是好奇是否有任何API可以获取您引用的路径?@c0000fd回收站虚拟文件夹经过。使用
KNOWNFOLDERID
s在下进行了解释。@IInspectable:是的,我知道。问题是如何获取特定驱动器的回收站路径,例如
C:
?@david.pfx。对不起,我不明白你的逻辑。你能举个例子吗?显然,要使用
GetFinalPathnameByHandle
,需要回收站文件的句柄,对吗?您可以使用已知的文件夹ID打开提供句柄的文件或文件夹。然后你可以从手柄上得到路径。谢谢你提供的信息。根据你的信息,我想出了一个公式。我在这里描述了它:但有一个问题——回收站文件夹(这部分
C:\$recycle.bin
)是否总是放在驱动器的根目录中?换句话说,它不可能是
C:\Something\$Recycle.Bin
,对吗?我知道-总是在驱动器的根目录下。有一种特殊情况,可能相关,也可能无关:如果用户的文档文件夹被重定向到网络(UNC)路径,Windows会创建一个回收站文件夹作为文档的子文件夹。@HarryJohnston:好的观点。谢谢我刚测试过。任何重定向的文件夹(不仅仅是文档)都可以有自己的回收站。一旦客户机用户帐户中的某个文件夹被删除,它就会在服务器上作为子文件夹创建。服务器上的路径可以是这样的:
C:\Home\UserName\Documents\$RECYCLE.BIN
。请注意,从未重定向的文件夹中删除将进入常规recyc