如何绕过Java的窗户MAX_PATH WinAPI的限制(How does Java circum

2019-06-23 12:57发布

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

Answer 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如果((pathlen = wcslen(path)) > MAX_PATH - 1)
  • 由函数wcanonicalizeWithPrefix

我没有跟踪调用链比更远,但我相信在JVM总是使用这些标准化程序访问文件系统之前,所以总是打这个代码拉上。 如果你想跟踪的调用链更远自己,你也可以在浏览JVM源代码的乐趣分享! 下载: http://download.java.net/openjdk/jdk6/



Answer 2:

窗户绕过限制,如果路径前缀\\?\



Answer 3:

最有可能的Java是使用含(\?)内部UNC路径的事实。



文章来源: How does Java circumvent the windows MAX_PATH WinAPI limitation