java - Java如何绕过windows MAX_PATH WinAPI限制

标签 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();
        }
    }
}

最佳答案

来自 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/

关于java - Java如何绕过windows MAX_PATH WinAPI限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10094365/

相关文章:

java - 使用 android studio : "Unfortunately, My application has stopped" 将数据导出到 google 表

java - 对数组中大于输入值的数字求和

windows - NSIS 自动和静默更新

python - kmedoids 使用具有各种距离函数的 Pycluster

python - write 和 tempfile.write 的区别

python - 将打开的文件从一个函数传递到另一个函数

java - 在我的程序中找不到这个错误

java - JPA:使用附加属性映射多对多关系

c++ - Windows 中以毫秒为单位的时间戳

javascript - 将数据从 .txt 文件发送到 JavaScript 数组