Java如何规避windows MAX_PATH WinAPI限制
Posted
技术标签:
【中文标题】Java如何规避windows MAX_PATH WinAPI限制【英文标题】:How does Java circumvent the windows MAX_PATH WinAPI limitation 【发布时间】:2012-04-23 01:47:49 【问题描述】:有谁知道 Java 是如何绕过 Windows MAX_PATH 限制的。使用下面的代码,我能够在 Java 中创建一个非常长的路径并且能够执行 I/O,这在没有前缀 \\?\ 的情况下使用 windows 是不可能的。
public static void main(String[] args) throws IOException
BufferedWriter bufWriter = null;
try
StringBuilder s = new StringBuilder();
for (int i = 0; i < 130; i++)
s.append("asdf\\");
String filePath = "C:\\" + s.toString();;
System.out.println("File Path = " + filePath);
File f = new File(filePath);
f.mkdirs();
f = new File(f, "dummy.txt");
System.out.println("Full path = " + f);
bufWriter = new BufferedWriter(new FileWriter(f));
bufWriter.write("Hello");
catch (Exception e)
e.printStackTrace();
finally
if (bufWriter != null)
bufWriter.close();
【问题讨论】:
您使用的是什么版本的 Windows? 【参考方案1】:来自JVM的canonicalize_md.c
:
/* copy \\?\ or \\?\UNC\ to the front of path*/
WCHAR* getPrefixed(const WCHAR* path, int pathlen)
[download JVM source code (below) to see implementation]
函数getPrefixed
被调用:
wcanonicalize
if ((pathlen = wcslen(path)) > MAX_PATH - 1)
通过函数wcanonicalizeWithPrefix
。
我没有跟踪调用链比这更远,但我假设 JVM 总是在访问文件系统之前使用这些规范化例程,因此总是以一种或另一种方式命中这段代码。如果您想更深入地跟踪调用链,您也可以享受浏览 JVM 源代码的乐趣!下载地址:http://download.java.net/openjdk/jdk6/
【讨论】:
谢谢,这回答了我的问题。 根据JDK-4403166,从 5.0u6 和 6.0 开始大部分已修复。【参考方案2】:如果路径以 \\?\
为前缀,Windows 会绕过该限制。
【讨论】:
我知道 Windows 是如何绕过它的,我更想知道 Java 是如何做到的。【参考方案3】:Java 很可能实际上在内部使用 UNC 路径 (\?)。
【讨论】:
以上是关于Java如何规避windows MAX_PATH WinAPI限制的主要内容,如果未能解决你的问题,请参考以下文章
“TCHAR cFileName[MAX_PATH];” - MSDN 库中的错误?
了解爬虫的风险与以及如何规避风险-Java网络爬虫系统性学习与实战系列
了解爬虫的风险与以及如何规避风险-Java网络爬虫系统性学习与实战系列