我想从给定的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是否\下载\ Gfl4AHIHf6SVMPMT9hjitNZOSXVofG1A9VJrv66YerqDfW8TW73O3VUb1wYYnOOB2l9CvSmTjfPLUvIwwvkddiL3sj7XNB1gqGGrUnmotsG4V3WR50SV1JAkXe2M0MpR4VDoYAUt5WgLpdLqoIdRlH4bd7OcZ3j0GOs90FGuZpZpjhEZBobNz1CwK50jJWYCwAHNmaYOYrC3JnOl6xtX4phNJm \ Gfl4AHIHf6SVMPMT9hjitNZOSXVofG1A9VJrv66YerqDfW8TW73O3VUb1wYYnOOB2l9CvSmTjfPLUvIwwvkddiL3sj7XNB1gqGGrUnmotsG4V3WR50SV1JAkXe2M0MpR4VDoYAUt5WgLpdLqoIdRlH4bd7OcZ3j0GOs90FGuZpZpjhEZBobNz1CwK50jJWYCwAHNmaYOYrC3JnOl6xtX4phNJmdsMlll
Kernel32.INSTANCE.GetShortPathName
的返回值为 0 ,根据javadoc,返回值为
如果函数由于任何其他原因而失败,则返回值为零。要获取扩展的错误信息,请调用 GetLastError 。
调用 GetLastError 会返回 3 。
现在,使用以下命令:
dir /x
我可以看到该文件实际上具有一个已生成的简短名称(GFL4AH〜1)。
我错过了什么?
答案 0 :(得分:0)
我找到了解决方法:
int returnCode = Kernel32.INSTANCE.GetShortPathName("\\\\?\\" + file.toString(), result, result.length);
从MS文档开始:
要指定扩展长度的路径,请使用“ \?\”前缀。例如,“ \?\ D:\ very long path”。