2012-04-10 28 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