4

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

3 に答える 3

6

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/

于 2012-04-10T18:41:55.297 に答える
2

パスの前に。が付いている場合、Windowsはその制限をバイパスし\\?\ます。

于 2012-04-10T18:31:11.467 に答える
1

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

于 2012-04-10T18:30:55.400 に答える