Jef*_*ron 373 windows path limit
在不合时宜的时刻我几次反对这个问题:
为什么存在此限制?
为什么还没有被删除?
你如何应对路径限制?...而且,切换到Linux或Mac OS X不是这个问题的有效答案;)
小智 219
引用这篇文章http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath
最大路径长度限制
在Windows API中(以下段落中讨论了一些例外),路径的最大长度为MAX_PATH,定义为260个字符.本地路径按以下顺序构成:驱动器号,冒号,反斜杠,由反斜杠分隔的名称组件以及终止空字符.例如,驱动器D上的最大路径是"D:\ 某个256个字符的路径字符串 <NUL>",其中"<NUL>"表示当前系统代码页的不可见的终止空字符.(这里使用字符<>是为了清晰,不能成为有效路径字符串的一部分.)
现在我们看到它是1 + 2 + 256 + 1或[drive] [:\] [path] [null] = 260.可以假设256是从DOS天开始的合理固定字符串长度.回到DOS API,我们意识到系统跟踪每个驱动器的当前路径,并且我们有26个(带符号的32个)最大驱动器(和当前目录).
INT 0x21 AH = 0x47表示"此函数返回没有驱动器号和初始反斜杠的路径描述."因此我们看到系统将CWD存储为一对(驱动器,路径),并通过指定路径来请求路径驱动器(1 = A,2 = B,...),如果指定0,则它假定INT 0x21 AH = 0x15 AL = 0x19返回的驱动器路径.所以现在我们知道为什么它是260而不是256,因为那4个字节没有存储在路径字符串中.
为什么是256字节的路径字符串,因为640K足够RAM.
sof*_*eda 144
这并不严格,因为NTFS文件系统支持最多32k字符的路径.您可以使用win32 api和\\?\路径前缀" "来使用超过260个字符.
从.Net BCL团队博客的详细解释.
一个小的摘录突出了长路径的问题
另一个问题是暴露长路径支持会导致不一致的行为.带有
\\?\前缀的长路径可用于大多数与文件相关的Windows API,但不能用于所有Windows API.例如,如果文件名长于MAX_PATH,则将模块映射到调用进程的地址的LoadLibrary将失败.所以这意味着MoveFile将允许您将DLL移动到一个位置,使其路径超过260个字符,但是当您尝试加载DLL时,它将失败.整个Windows API都有类似的例子; 存在一些变通方法,但它们是逐案处理的.
Ian*_*oyd 103
问题是为什么限制仍然存在.当然,现代Windows可以增加侧面MAX_PATH以允许更长的路径.为什么没有删除限制?
通过API合同,Windows保证所有应用程序标准文件API永远不会返回比260字符更长的路径.
请考虑以下正确的代码:
WIN32_FIND_DATA findData;
FindFirstFile("C:\Contoso\*", ref findData);
Run Code Online (Sandbox Code Playgroud)
Windows 保证我的程序将填充我的WIN32_FIND_DATA结构:
WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
//...
TCHAR cFileName[MAX_PATH];
//..
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序没有声明常量的值MAX_PATH,Windows API也没有.我的应用程序使用了定义的值.
我的结构已正确定义,并且只分配592字节总数.这意味着我只能接收小于260字符的文件名.Windows 向我承诺,如果我正确地编写了我的应用程序,我的应用程序将来会继续运行.
如果Windows允许文件名长于260字符,则我现有的应用程序(正确使用正确的API)将失败.
对于任何要求Microsoft更改MAX_PATH常量的人,他们首先需要确保没有现有的应用程序失败.例如,我仍然拥有并使用在Windows 3.11上运行的Windows应用程序.它仍然在64位Windows 10上运行.这就是向后兼容性所带来的.
微软确实创造了一种使用完整的32,768个路径名的方法; 但是他们必须创建一个新的API合同来完成它.首先,您应该使用Shell API枚举文件(因为并非所有文件都存在于硬盘驱动器或网络共享上).
但他们也必须不破坏现有的用户应用程序.绝大多数应用程序不使用shell api进行文件工作.每个人只需要打电话FindFirstFile/ FindNextFile并且每天打电话.
Roo*_*oop 60
从Windows 10.您可以通过修改注册表项来消除限制.
提示 从Windows 10版本1607开始,MAX_PATH限制已从常见的Win32文件和目录函数中删除.但是,您必须选择加入新行为.
注册表项允许您启用或禁用新的长路径行为.要启用长路径行为,请将注册表项设置为
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled(Type :)REG_DWORD.在第一次调用受影响的Win32文件或目录函数(后面的列表)之后,系统(每个进程)将缓存键的值.在进程的生命周期内不会重新加载注册表项.为了使系统上的所有应用程序能够识别密钥的值,可能需要重新启动,因为某些进程可能在密钥设置之前已经启动.注册表项也可以通过组策略来控制Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.您还可以通过清单为每个应用启用新的长路径行为:Run Code Online (Sandbox Code Playgroud)<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings"> <ws2:longPathAware>true</ws2:longPathAware> </windowsSettings> </application>
jon*_*ang 31
您可以将文件夹作为驱动器安装.从命令行,如果您有路径C:\path\to\long\folder,可以X:使用以下命令将其映射到驱动器号:
subst x: \path\to\long\folder
Run Code Online (Sandbox Code Playgroud)
JDi*_*teo 17
处理路径限制的一种方法是使用符号链接缩短路径条目.
例如:
C:\p目录以保持到长路径的短链接mklink /J C:\p\foo C:\Some\Crazy\Long\Path\fooC:\p\foo到您的路径而不是长路径您可以使用PowerShell启用长路径名:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Type DWord -Value 1
Run Code Online (Sandbox Code Playgroud)
另一个版本是在Computer Configuration/ Administrative Templates/ System/中使用组策略Filesystem:
至于为什么这仍然存在 - MS并不认为它是一个优先事项,并且在推进其操作系统方面具有向后兼容性(至少在这种情况下).
我使用的解决方法是使用路径中目录的"短名称",而不是标准的人类可读版本.因此,例如用于C:\Program Files\我会用C:\PROGRA~1\ 你可以找到使用短名称等同dir /x.
至于如何应对Windows上的路径大小限制 - 使用7zip打包(和解压缩)路径长度敏感文件似乎是一个可行的解决方法.我已经用它来传输几个IDE安装(那些Eclipse插件路径,yikes!)和成堆的自动生成的文档,到目前为止还没有出现过任何问题.
不确定它如何规避Windows设置的260字符限制(来自技术PoV),但是嘿,它有效!
他们的SourceForge页面上的更多细节在这里:
"NTFS实际上可以支持最多32,000个字符的路径名."
7-zip也支持这么长的名字.
但它在SFX代码中被禁用.有些用户不喜欢长路径,因为他们不了解如何使用它们.这就是我在SFX代码中禁用它的原因.
和发行说明:
9.32 alpha 2013-12-01
- 改进了对长度超过260个字符的文件路径名的支持.
4.44 beta 2007-01-20
- 7-Zip现在支持超过260个字符的文件路径名.
重要说明:为使其正常工作,您需要直接在7zip "提取"对话框中指定目标路径,而不是将文件拖放到目标文件夹中.否则,"Temp"文件夹将用作临时缓存,一旦Windows资源管理器开始将文件移动到"最终安放位置",您将跳转到相同的260 char限制.有关详细信息,请参阅对此问题的回复.
确实如此,由于某种原因它是默认值,但是您可以使用此注册表项轻松覆盖它:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Run Code Online (Sandbox Code Playgroud)
请参阅:https : //blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
| 归档时间: |
|
| 查看次数: |
293386 次 |
| 最近记录: |