草庐IT

java - Windows 10中的最大文件名长度是多少? Java会尝试/捕获会低谷exeption?

coder 2024-06-15 原文

在旧版本的windows中,我知道文件或文件夹的最大长度大约为250个字符,有人知道他们是否在windows 10中更改了它吗?
编辑:
我在给定API周围做一些Java代码来提取一个应用程序的一些内容,将是几千个文件,并且我对可能发生的事情有点担心,因为我不知道文件名和路径将是什么样子,所以我将尝试防止这些错误,或者可能在Java中更改名称。保存(但最好保留原始名称)
那么你知道会不会有一些豁免?File file = new File(jsonFile);?谢谢,我可以在接球的时候治疗

最佳答案

如果你真的是指文件名,我相信限制仍然是“通常”255个字符,请参阅下面的第三个引用段落(“WindowsAPI有很多…”)。
如果您是指文件路径:您可以启用“win32长路径”选项。从AA>
最大路径长度限制
在windows api中(除了以下段落中讨论的一些例外),路径的最大长度是max_path,它定义为260个字符。本地路径的结构顺序如下:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止的空字符。例如,驱动器d上的最大路径为“D:\some 256-character path string<NUL>”,其中“<NUL>”表示当前系统代码页的不可见终止空字符。(此处使用字符<>是为了视觉清晰,不能是有效路径字符串的一部分。)
注释
Windows API中的文件I/O函数将“/”转换为“\”,作为将名称转换为NT样式名称的一部分,除非使用“\\?\”前缀,如以下各节所述。
windows api有许多函数也有unicode版本,允许最大总路径长度为32767个字符的扩展路径。这种类型的路径由由反斜杠分隔的组件组成,每个组件都不超过getvolumeinformation函数的lpmaximumcomponentlength参数中返回的值(该值通常为255个字符)。要指定扩展长度路径,请使用“\\?\”前缀。例如,“\\?\D:\very long path”。
注释
最大路径为32767个字符,这是近似值,因为系统可以在运行时将“\\?\”前缀扩展为更长的字符串,并且此扩展适用于总长度。
前缀“\\?\”也可用于根据通用命名约定(unc)构造的路径。要使用unc指定这样的路径,请使用“\\?\UNC\”前缀。例如,“\\?\UNC\server\share”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不作为路径本身的一部分使用。它们表示路径应该以最小的修改传递给系统,这意味着您不能使用正斜杠表示路径分隔符,也不能使用句点表示当前目录,也不能使用双点表示父目录。由于不能将“\\?\”前缀与相对路径一起使用,相对路径始终限制为最多路径字符的总数。
对于windows文件i/o api函数使用的路径和文件名字符串,不需要执行任何unicode规范化,因为文件系统将路径和文件名视为wchars的不透明序列。应用程序所需的任何规范化都应在执行时考虑到这一点,即对相关windows文件i/o api函数的任何调用的外部。
使用api创建目录时,指定的路径不能太长,以致于不能附加8.3文件名(即目录名不能超过max_path减12)。
shell和文件系统有不同的要求。可以使用windows api创建shell用户界面无法正确解释的路径。
在Windows 10、1607及更高版本中启用长路径
从Windows 10 1607版开始,已从常见的win32文件和目录函数中删除了最大路径限制。但是,您必须选择新的行为。
要启用新的长路径行为,必须满足以下两个条件:
注册表项HKLM\SYSTEM\CurrentControlSet\Control\FileSystemLongPathsEnabled(类型: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>

如果选择长路径行为,这些目录管理函数将不再具有最大路径限制:createdirectoryw,createdirectoryexw getcurrentdirectoryw removedirectoryw setcurrentdirectoryw。
如果选择长路径行为,这些文件管理函数将不再具有最大路径限制:copyFilew、copyFile2、copyFileExw、createFilew、createFile2、createHardLinkw、createSymbolicInkw、deleteFilew、findFirstFilew、findFirstFileExw、findNextFilew、getFileAttributesw,getfileattributesexw、setfileattributesw、getfullpathnamew、getlongpathnamew、movefileexw、movefilewithprogressw、replacefilew、searchpathw、findfirstfilenamew、findnextfilenamew、findfirststreamw、findnextstreamw、getcompressedfilesizew、getfinalpathnamebyhandlew。
请注意,虽然文章中说组策略编辑器的设置是“启用ntfs长路径”,但现在已经不是这样了;现在是“启用win32长路径”:
this Microsoft document

关于java - Windows 10中的最大文件名长度是多少? Java会尝试/捕获会低谷exeption? ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807466/

有关java - Windows 10中的最大文件名长度是多少? Java会尝试/捕获会低谷exeption?的更多相关文章

  1. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐