我在不合时宜的时候遇到过这个问题几次:
为什么会有这个限制呢?
为什么它还没有被移除?
您如何应对路径限制?不,切换到Linux或Mac不是这个问题的有效答案;)
发布于 2009-12-10 19:52:51
这并不完全正确,因为NTFS文件系统支持最多32k个字符的路径。您可以使用win32接口并在路径前加上"\\?\
“前缀,以使用超过260个字符。
来自.Net BCL team blog的长路径的详细说明。
一小段摘录突出了长路径的问题
另一个问题是暴露长路径支持可能导致的不一致行为。大多数与文件相关的Windows都可以使用带有
\\?\
前缀的长路径,但并非所有Windows都可以使用。例如,如果文件名大于MAX_PATH,则将模块映射到调用进程的地址的LoadLibrary将失败。因此,这意味着MoveFile将允许您将动态链接库移动到某个位置,使其路径超过260个字符,但是当您尝试加载动态链接库时,它将失败。在所有Windows中都有类似的示例;存在一些变通方法,但它们是基于具体情况的。
发布于 2015-06-30 23:47:36
问题是为什么的限制仍然存在。当然,现代的Windows可以增加MAX_PATH
的侧边,以允许更长的路径。为何没有取消限制呢?
考虑以下正确的代码:
WIN32_FIND_DATA findData;
FindFirstFile("C:\Contoso\*", ref findData);
Windows 向我的程序保证它将填充我的WIN32_FIND_DATA
结构:
WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
//...
TCHAR cFileName[MAX_PATH];
//..
}
我的应用程序没有声明常量MAX_PATH
的值,而是Windows API声明的。我的应用程序使用了这个定义值。
我的结构定义正确,总共只分配592
字节。这意味着我只能接收少于260
个字符的文件名。Windows 向承诺,如果我正确编写了应用程序,我的应用程序将来将继续工作。
如果Windows允许文件名超过260
字符,那么我的现有应用程序(正确使用了正确的API )将会失败。
它仍然可以在64位的Windows10上运行,这就是向后兼容给你带来的好处。
Microsoft确实创建了一种使用完整32,768路径名的方法;但他们必须创建一个新的契约来实现这一点。首先,您应该使用Shell API来枚举文件(因为并非所有文件都存在于硬盘驱动器或网络共享中)。
但它们也不能破坏现有的用户应用程序。绝大多数应用程序不使用shell api 文件工作。每个人都会给FindFirstFile
/FindNextFile
打电话,然后就到此为止了。
发布于 2016-10-28 20:49:27
在Windows10中,您可以通过修改注册表项来remove the limitation。
提示从Windows10版本1607开始,已从常见的Win32文件和目录函数中删除了MAX_PATH限制。但是,您必须选择接受新的行为。
注册表项允许您启用或禁用新的长路径行为。要启用长路径行为,请将注册表项设置为HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled
(类型:REG_DWORD
)。在第一次调用受影响的Win32文件或目录函数(列表如下)之后,系统(每个进程)将缓存该键的值。在进程的生存期内不会重新加载注册表项。为了让系统上的所有应用程序识别密钥的值,可能需要重新启动,因为某些进程可能已在设置密钥之前启动。注册表项也可以通过Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths
上的组策略进行控制。您还可以通过清单为每个应用程序启用新的长路径行为:
true
https://stackoverflow.com/questions/1880321
复制相似问题