有谁知道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();
}
}
}
来自 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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)