Короткое имя пути к файлу в Windows не возвращается правильно - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу получить короткий путь к файлу по заданному пути Windows. По этой причине я использую следующий код JAVA (с библиотекой JNA):

    char[] result = new char[65535];
    Kernel32.INSTANCE.GetShortPathName(file.toString(), result, result.length);
    System.out.println(Native.toString(result));

Приведенный выше код работает нормально. Однако в некоторых случаях возвращаемое значение является пустой строкой. Например, используя следующий существующий путь в Windows, вы получите пустое значение:

C: \ Users \ someuser \ Downloads \ Gfl4AHIHf6SVMPMT9hjitNZOSXVofG1A9VJrv66YerqDfW8TW73O3VUb1wYYnOOB2l9CvSmTjfPLUvIwwvkddiL3sj7XNB1gqGGrUnmotsG4V3WR50SV1JAkXe2M0MpR4VDoYAUt5WgLpdLqoIdRlH4bd7OcZ3j0GOs90FGuZpZpjhEZBobNz1CwK50jJWYCwAHNmaYOYrC3JnOl6xtX4phNJm \ Gfl4AHIHf6SVMPMT9hjitNZOSXVofG1A9VJrv66YerqDfW8TW73O3VUb1wYYnOOB2l9CvSmTjfPLUvIwwvkddiL3sj7XNB1gqGGrUnmotsG4V3WR50SV1JAkXe2M0MpR4VDoYAUt5WgLpdLqoIdRlH4bd7OcZ3j0GOs90FGuZpZpjhEZBobNz1CwK50jJWYCwAHNmaYOYrC3JnOl6xtX4phNJmdsMlll

Возвращаемое значение Kernel32.INSTANCE.GetShortPathName равно 0 , что согласно javadoc равно

Если функция не работает по какой-либо другой причине, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError .

Вызов GetLastError возвращает 3 .

Теперь с помощью следующей команды:

dir /x

Я вижу, что файл на самом деле имеет сгенерированное ранее короткое имя (GFL4AH ~ 1).

Что я пропустил?

1 Ответ

0 голосов
/ 12 ноября 2018

Я нашел решение:

 int returnCode = Kernel32.INSTANCE.GetShortPathName("\\\\?\\" + file.toString(), result, result.length);

Из документов MS:

Чтобы указать путь расширенной длины, используйте префикс "\? \". Например, «\? \ D: \ очень длинный путь».

...