2012-04-10 2 views
4

Кто-нибудь знает, как Java может обойти ограничения MAX_PATH в Windows. Используя приведенный ниже код, я смог создать действительно длинный путь в Java и смог выполнить ввод-вывод, что было бы невозможно с использованием окон без префикса \\? \.Как 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 вы используете? –

+0

Я использую Windows 7 ... – Rajiv

ответ

5

Из виртуальной машины Java-х 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

+0

@Rajiv Я обновил свой ответ кодом JVM –

+0

Спасибо, что отвечает на мой вопрос. – Rajiv

1

Скорее всего, Java фактически использует UNC-пути (\?) Внутренне.

2

Windows обходит это ограничение, если путь имеет префикс \\?\.

+0

+1: Страшно sh! T. ;) –

+0

Я знаю, как Windows обходит его, мне больше интересно узнать, как это делает Java. – Rajiv

+2

@Rajiv: Скорее всего, он просто префиксы этого пути с \\? \ ... – Mehrdad

Смежные вопросы