java - Windows 10 中的最大文件名长度是多少?Java会尝试/捕获会通过异常吗?
问题描述
在旧版本的 Windows 中,我知道文件或文件夹的最大值约为 250 个字符,有人知道他们是否在 Windows 10 中更改了它吗?
编辑:
我正在围绕给定 API 做一些 Java 代码来提取应用程序的一些内容,将是几千个文件,我有点担心会发生什么,因为我不知道文件名和路径会是什么样子所以我会尽量防止这些错误,可能会在保存之前更改 Java 中的名称(但最好保留原始名称),
所以你知道是否会有一些豁免被抛出?File file = new File(jsonFile);
? 谢谢我可能会接受治疗
解决方案
如果您真的是指文件名,我相信限制仍然是“通常”255 个字符,请参阅下面的第三个引用段落(“Windows API 有很多...”)。
如果您的意思是文件路径:您可以启用“Win32 长路径”选项。从这个微软文档:
最大路径长度限制
在 Windows API(以下段落中讨论的一些例外情况)中,路径的最大长度为MAX_PATH,定义为 260 个字符。本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止空字符。例如,驱动器 D 上的最大路径是“
D:\some 256-character path string<NUL>
”,其中“<NUL>
”表示当前系统代码页的不可见终止空字符。(字符 < > 在此处用于视觉清晰,不能作为有效路径字符串的一部分。)笔记
Windows API 中的文件 I/O 函数将“
/
”转换为“\
”,作为将名称转换为 NT 样式名称的一部分,除非使用\\?\
以下部分中详述的“ ”前缀。Windows API 有许多函数也有 Unicode 版本,以允许最大总路径长度为 32,767 个字符的扩展长度路径。这种类型的路径由由反斜杠分隔的组件组成,每个组件都达到 GetVolumeInformation 函数的 lpMaximumComponentLength 参数中返回的值(该值通常为 255 个字符)。要指定扩展长度的路径,请使用“
\\?\
”前缀。例如,“\\?\D:\very long path
”。笔记
32,767 个字符的最大路径是近似的,因为“
\\?\
”前缀可能会在运行时被系统扩展为更长的字符串,并且这种扩展适用于总长度。“
\\?\
”前缀也可以用于根据通用命名约定 (UNC) 构建的路径。要使用 UNC 指定此类路径,请使用“\\?\UNC\
”前缀。例如,“\\?\UNC\server\share
”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。它们表明路径应该以最少的修改传递给系统,这意味着您不能使用正斜杠来表示路径分隔符,或者使用句点来表示当前目录,或者使用双点来表示父目录。因为您不能将“\\?\
”前缀与相对路径一起使用,所以相对路径总是被限制为总共MAX_PATH个字符。无需对路径和文件名字符串执行任何 Unicode 规范化以供 Windows 文件 I/O API 函数使用,因为文件系统将路径和文件名视为WCHAR的不透明序列。您的应用程序所需的任何规范化都应牢记这一点,在对相关 Windows 文件 I/O API 函数的任何调用之外。
使用API创建目录时,指定路径不能太长,不能附加8.3文件名(即目录名不能超过MAX_PATH减12)。
shell 和文件系统有不同的要求。可以使用 shell 用户界面无法正确解释的 Windows API 创建路径。
在 Windows 10 版本 1607 及更高版本中启用长路径
从 Windows 10 版本 1607 开始,MAX_PATH限制已从常见的 Win32 文件和目录函数中删除。但是,您必须选择加入新行为。
要启用新的长路径行为,必须同时满足以下两个条件:
- 注册表项
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem
LongPathsEnabled
(类型:REG_DWORD)必须存在并设置为 1。在第一次调用受影响的 Win32 文件或目录函数后,系统(每个进程)将缓存该键的值(函数列表见下文) . 在进程的生命周期内不会重新加载注册表项。为了让系统上的所有应用程序都能识别密钥的值,可能需要重新启动,因为某些进程可能在设置密钥之前已经启动。笔记
此注册表项也可以通过计算机配置 > 管理模板 > 系统 > 文件系统 > 启用 NTFS 长路径中的组策略进行控制。
应用程序清单还必须包含 longPathAware 元素。
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings xmlns:ws2="https://schemas.microsoft.com/SMI/2016/WindowsSettings"> <ws2:longPathAware>true</ws2:longPathAware> </windowsSettings> </application>
如果您选择加入长路径行为,这些目录管理功能将不再具有MAX_PATH限制:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW。
如果您选择加入长路径行为,这些文件管理函数将不再具有MAX_PATH限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、CreateSymbolicLinkW、DeleteFileW、FindFirstFileW、FindFirstFileExW、FindNextFileW、GetFileAttributesW、GetFileAttributesExW、SetFileAttributesW、 GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileNameW、FindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。
请注意,虽然那篇文章说组策略编辑器的设置是“启用 NTFS 长路径”,但情况已不再如此;现在是“启用 Win32 长路径”:
推荐阅读
- reactjs - Reactjs:无法使用“npm start”启动开发服务器
- r - 使用 Quanteda 清理语料库
- electron - 我的 spectron app.client 不包含所有方法
- javascript - 尝试运行 Node.js 应用程序时如何修复“语法错误:无效或意外令牌”
- r - 将 case_when 和 between 与对应阈值表一起使用
- html - 弹性项目中的锚标记尊重所有填充,没有 display:inline-block 属性的边距。这是为什么?
- python - 将结果从并行计算移动到 Python 中的最终数组
- wordpress - pubDate 未与 Wordpress 网站的时区同步
- angular - TinyMCE 角度代码和链接覆盖在角度反应形式中不起作用
- reactjs - 如何将cordova相机插件与framework7 react一起使用