【问题标题】:How does Java circumvent the windows MAX_PATH WinAPI limitationJava如何规避windows MAX_PATH WinAPI限制
【发布时间】: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?

标签: java windows file max-path


【解决方案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)) &gt; 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 路径 (\?)。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2011-06-04
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2010-10-24
    • 2011-06-20
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多