2012-04-10 46 views
4

有谁知道Java如何能够规避Windows MAX_PATH限制。使用下面的代码,我能够在Java中创建一个非常长的路径,并且能够执行I/O,而使用不带前缀\\?\的窗口是不可能的。Java如何规避Windows MAX_PATH WinAPI限制

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(); 
     } 
    } 
} 
+0

您使用的是哪个版本的Windows? – 2012-04-10 18:32:38

+0

我正在使用Windows 7 ... – Rajiv 2012-04-10 18:38:02

回答

5

从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/

+0

是的,我修正了这个问题。谢谢。 – Rajiv 2012-04-10 19:02:01

+0

@Rajiv我用JVM的代码更新了我的答案 – 2012-04-10 19:15:47

+0

谢谢,这回答我的问题。 – Rajiv 2012-04-11 03:54:54

1

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

2

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

+0

+1:可怕的sh!t。 ;) – 2012-04-10 18:32:43

+0

我知道Windows如何绕过它,我更感兴趣知道Java如何做到这一点。 – Rajiv 2012-04-10 18:38:40

+2

@Rajiv:最有可能它只是前缀的路径\\?\ ... – Mehrdad 2012-04-10 18:39:47