Java如何规避Windows MAX_PATH WinAPI限制

时间:2012-04-10 18:29:58

标签: java windows file max-path

有谁知道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();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

来自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如果((pathlen = wcslen(path)) > MAX_PATH - 1)
  • 功能wcanonicalizeWithPrefix

我没有追踪到比这更远的调用链,但我认为JVM在访问文件系统之前总是使用这些规范化例程,所以总是以这种或那种方式命中这个代码。如果你想自己追踪更远的调用链,你也可以参与浏览JVM源代码的乐趣!下载地址:http://download.java.net/openjdk/jdk6/

答案 1 :(得分:2)

如果路径前缀为\\?\,则Windows会绕过该限制。

答案 2 :(得分:1)

Java很可能实际上是在内部使用UNC路径(\?)。