如何对长路径名使用NSIS Unicode\\?\前缀

如何对长路径名使用NSIS Unicode\\?\前缀,unicode,path,nsis,Unicode,Path,Nsis,我正在使用NSIS创建安装程序,但在长路径名(>260个字符)方面存在问题。我听说过unicode版本,它可以处理带有特殊前缀\\?\的长路径名。 我想知道是否有文档描述了\\?\前缀的作用以及如何使用它。我正在非unicode NSIS版本中使用文件/r/x根..* 这里描述了同样的问题,但没有真正的解决方案 操作系统为Windows 7,错误消息为 File: failed opening file "..\server\WEB-INF\classes\some\very\long\and\

我正在使用NSIS创建安装程序,但在长路径名(>260个字符)方面存在问题。我听说过unicode版本,它可以处理带有特殊前缀
\\?\
的长路径名。 我想知道是否有文档描述了
\\?\
前缀的作用以及如何使用它。我正在非unicode NSIS版本中使用
文件/r/x根..*

这里描述了同样的问题,但没有真正的解决方案

操作系统为Windows 7,错误消息为

File: failed opening file "..\server\WEB-INF\classes\some\very\long\and\winding\path\myFile.txt"
Error in script "D:\real\long\path\to\nsis\my.nsis.updater.nsi" on line 116 -- aborting creation process
这条线是我的电话

File /r /x nsis ..\*

它打包了我的内容。

您可以在中获得有关路径的文档。

对长路径有一些支持,但我不确定
文件的编译器部分是否是其中之一

官方NSIS不支持长路径的原因有两个:

  • \\?\
    前缀告诉Windows在用户模式下根本不解析路径,因此您将失去对相对路径的支持。然后,我们必须实现我们自己的具有相对路径支持的路径解析器。这还意味着每次使用路径时,我们都必须分配内存并解析/扩展到完整路径

  • Exec*
    CreateProcess
    /
    ShellExecute
    )、
    CreateShortcut
    IShellLink
    )和
    CopyFiles
    SHFileOperation
    )不支持长路径,因此有些指令支持长路径,有些则不支持。这意味着最终用户可以在无法执行的文件夹中安装.exe


您可能可以创建一些代码,将文件提取到$pluginsdir,然后使用系统插件直接使用长目标路径调用kernel32::CreateDirectory和kernel32::MoveFile…

您的操作系统是什么?你遇到了什么问题?有错误消息吗?你不是唯一一个有问题的人,你的用户也会有问题。你可能从未听说过的程序失败了。像某种备份实用程序或搜索索引器。除非你喜欢接到很难接听的支持电话,否则不要这样做。谁会呢?我不认为用户也会有问题,因为NSIS抱怨整个路径太长。如果我将基本路径设置为c:\tmp,则一切正常。我的项目根目录的相对路径比最大路径限制短得多。我还不明白为什么NSIS在打包文件时需要完整路径。从我的观点来看,NSIS编译器必须从一个根位置开始,OK,但是从那时起,要考虑的路径仅仅是根之后的部分。打包的文件结构肯定不知道它从创建者磁盘上的何处打包,只存储创建根目录下的目录树。或者我完全错了吗?NSIS编译器所做的并不是真正的重点,“\\?\…\abc”不是有效的路径,因为\\?\前缀仅适用于完整路径,因此任何想要超过最大路径(260)限制的程序都需要为其调用的Windows函数提供绝对路径。在您的示例中,MakeNSIS最终将调用FindFirstFile(“\\?\..\*”),这将失败。FindFirstFile(“..\*”)将起作用,但随后您将回到已经达到的最大路径限制。