2012-04-10 3 views
4

JavaがWindowsのMAX_PATHの制限を克服する方法を知っていますか?以下のコードを使用すると、Javaで本当に長いパスを作成でき、I/Oを実行することができました。これは、接頭辞\\?\を付けずにウィンドウを使用することは不可能でした。Javaはどのようにウィンドウを迂回するのですか?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のバージョンは? –

+0

私はWindows 7を使用しています... – Rajiv

答えて

5

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

+0

@Rajiv私はJVMのコードで私の答えを更新しました –

+0

ありがとう、それは私の質問に答える。 – Rajiv

1

ほとんどの場合、Javaは実際には内部的にUNCパス(\?)を使用しています。

2

パスに接頭辞\\?\が付いている場合、Windowsではその制限が回避されます。 JVMのcanonicalize_md.cから

+0

+1:Scary sh!t。 ;) –

+0

私はWindowsがそれをバイパスする方法を知っています。私はJavaのしくみを知ることにもっと興味があります。 – Rajiv

+2

@Rajiv:ほとんどの場合、そのパスの接頭辞は\\?\ ... – Mehrdad

関連する問題