【问题标题】:Are Extended-Length Paths safe to use?扩展长度路径可以安全使用吗?
【发布时间】:2010-08-28 18:02:40
【问题描述】:

我刚刚在 MSDN 上偶然发现了 this article,它说路径可以是 259 个字符 + NUL 终止,但是如果你在它前面加上“\\?\”前缀,WinAPI 允许你使用

最大总路径长度为 32,767 个字符。

渴望看到它工作我尝试使用资源管理器中的前缀(在 XP SP3 上),但它根本不起作用(在任何路径上)。如果你把\\?\C:\Path\to\an\existing.file放在资源管理器栏,会报“找不到文件”的错误。

所以我很困惑。我可以为(非古代)Windows 编写一些代码,充分利用 NTFS 上提到的路径大小吗?为什么 Explorer 不使用它?

【问题讨论】:

  • 至少在 Windows 7 中工作。在 XP 中,调用 API 函数时可能会起作用,但在 explorer.exe 的 GUI 中输入路径时不起作用(这可能会立即允许任意长度的路径)?
  • 好吧,我见过在 XP 中创建路径大于 259 的文件的软件(不记得是哪个),但资源管理器不允许我正确使用它们,甚至没有删除它们。要删除它们,我必须将父文件夹重命名为更短的名称。

标签: windows winapi path ntfs unc


【解决方案1】:

有一组 API 调用适用于扩展路径,有些则不适用。 MSDN 通常会提到这一点。

并不是说如果你只是在 xp 下的 windows explorer 中键入该路径,这是行不通的,因为扩展路径语法只是 WIn32 API 的转义序列,而不是 windows 资源管理器。现在,在 Win7 中这确实有效,因为很多人都希望它有效。

对于长路径,如果您更改工作目录或以子目录作为根目录打开资源管理器,这确实会有所帮助。

【讨论】:

  • 什么? “如果您更改工作目录或使用子目录作为根目录打开资源管理器,它确实有帮助”您的意思是 Windows 有一个chroot?还是你的意思是别的?
  • 是的 - 有一个 SetCurrentDirectory() 我可能错了 - 但在过去的某个时候,我 认为 有帮助。至少如果应用程序处理相对路径,而不是绝对路径。
  • 选择了,因为它已经有一段时间了。
  • @CamiloMartin: Windows 下的chrootsubst。请注意,它不是 Unix 中应该具有的安全功能,只是为了方便。
  • @Gabe 很高兴知道!如果我必须使用不喜欢路径中空格的 borked 脚本,可能会派上用场。
【解决方案2】:

在有人告诉我 RTFM 之前...

请注意,这些示例旨在与 Windows API 函数一起使用,并不一定都适用于 Windows 外壳应用程序,例如 Windows 资源管理器。
[...]
对于文件 I/O,路径字符串的“\\?\”前缀告诉 Windows API 禁用所有字符串解析并将其后面的字符串直接发送到文件系统。例如,如果文件系统支持大路径和文件名,则您可以超出由 Windows API 强制执行的 MAX_PATH 限制。

另一方面,这让我想知道通过使用非法文件名从资源管理器中隐藏文件(或查找此类文件)的可能性。

【讨论】:

    【解决方案3】:

    您是在问为什么 Windows 中的所有组件都不支持它,还是在问使用这些长路径是否合法?

    您绝对可以安全地使用它们,但您可能会激怒想要使用 Explorer 等工具来浏览它们的人。我们在野外经常看到这样的路径。有时候,当他们无法使用 MY_FAVORITE_TOOL 删除它时,人们会感到非常惊讶......

    【讨论】:

    • 我实际上正在考虑开发一个比资源管理器更笨的文件浏览器。我的意思是,NTFS 提供了一个类似 Unix 的可能性世界,而这些可能性在 XP 中根本没有使用
    • edit: “我正在考虑开发一个文件浏览器” = 从现在到时间结束之间的某个时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2010-10-15
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多