允许移动到回收站的最长文件路径是多少?
Posted
技术标签:
【中文标题】允许移动到回收站的最长文件路径是多少?【英文标题】:What is the longest file path allowed to be moved to Recycle Bin? 【发布时间】:2014-07-18 12:46:29 【问题描述】:对于我的应用程序,我正在测试允许移动到回收站的最长可用文件路径,我得到了有趣的结果。
在 Windows XP 上,最大大小为 259 个字符,即 MAX_PATH 常量减 1。
但在我的 Windows 8.1 Pro 上,最大允许的文件路径大小似乎是 215 个字符。
所以我很好奇是否有任何官方指南?
编辑:好的,因为下面的发帖人请求 API,我使用 SHFileOperation
与 FO_DELETE
和 FOF_ALLOWUNDO
将用户的文件放入回收站。由于 Windows 资源管理器对其删除操作使用相同的 API,因此很容易通过在 Windows 资源管理器中创建一个长路径然后尝试删除它来测试它。在我的实验中,我可以看到以下内容:
Windows XP,如果总路径长度为 259 个字符(在某些版本上可能为 257??),文件/文件夹将被放入回收站。否则,Windows 资源管理器仅提供永久删除它的选项。
Windows Vista,此限制为 217 个字符(含)。
Windows 7 和 8,包含 215 个字符。
所以看起来这个最大限制正在缩小......所以我很好奇,如果这在 MSDN 的某个地方有记录?
【问题讨论】:
这个问题属于superuser.com @Spook:为什么?这是一道编程题。 是的,在大多数情况下它可能属于两者,尽管我不确定用户为什么会真正关心这一点。对我来说,这绝对像是一个编程问题(属于这里)。还有一个很好的。 +1 IIRC “允许的最长 [总] 路径”大于 MAX_PATH:参考 ***.com/questions/265769/… 和 msdn.microsoft.com/en-us/library/windows/desktop/…(请参阅扩展长度路径:“Windows API 有许多也有 Unicode 版本的函数允许最大总路径长度为 32,767 个字符的扩展长度路径。") @c00000fd 不,不是。这是一个关于 Windows 文件系统,特别是 NTFS 的问题。 superuser.com/search?q=longest+file+path+windows 【参考方案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
使用 CSIDL 的 SHGetFolderPath:http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx
【讨论】:
哈。有趣的。感谢您的输入。现在说得通了。只是好奇是否有任何 API 可以获取您引用的路径? @c00000fd 回收站虚拟文件夹位于KNOWNFOLDERID
FOLDERID_RecycleBinFolder。使用KNOWNFOLDERID
s 在Working with Known Folders in Applications 下进行了解释。
@IInspectable:是的,我知道这一点。问题是如何获取特定驱动器的回收站路径,例如C:
?
@david.pfx。对不起,我没有按照你的逻辑。你能举个例子吗?显然需要一个回收站文件的句柄才能使用GetFinalPathnameByHandle
,对吧?
您可以使用已知的文件夹 ID 打开给您一个句柄的文件或文件夹。然后就可以从句柄中获取路径了。【参考方案2】:
回收站内部结构:
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 OriginalFileSize
0x0010 FILETIME DeleteFileTime
0x0018 WIDECHAR[MAX_PATH] OriginalFileNameW ; Wide string
第二个文件的名称类似于 $RNNNNNN.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 可以在回收站中存储任意路径的任意文件了。
【讨论】:
感谢您的信息。有了你的信息,我就能想出一个公式。我在这里描述过:forums.codeguru.com/… 一个问题——回收站文件夹(这部分C:\$Recycle.Bin
)总是放在驱动器的根目录中吗?也就是说,不可能是C:\Something\$Recycle.Bin
吧?
据我所知 - 始终位于驱动器的根目录中。
有一种特殊情况,可能相关也可能不相关:如果用户的 Documents 文件夹被重定向到网络 (UNC) 路径,Windows 会创建一个回收站文件夹作为 Documents 的子文件夹。
@HarryJohnston:好点。谢谢。我刚刚测试了它。发生的情况是任何重定向的文件夹(不仅是文档)都可以拥有自己的回收站。一旦从客户端用户帐户中的该文件夹中删除某些内容,它就会在服务器上创建为子文件夹。服务器上的路径可以是这样的:C:\Home\UserName\Documents\$RECYCLE.BIN
。请注意,从未重定向的文件夹中删除将进入常规回收站,或客户端计算机上根文件夹中的回收站。唔。这使事情变得复杂,因为无法访问服务器本身上的$RECYCLE.BIN
...以上是关于允许移动到回收站的最长文件路径是多少?的主要内容,如果未能解决你的问题,请参考以下文章