如何在Java中解组Windows文件名?

时间:2010-03-25 18:54:16

标签: java windows filenames name-mangling long-filenames

从Java,我将可执行文件解压缩到使用File.createTempFile()指定的位置。当我尝试运行我的可执行文件时,我的程序在尝试读取第一行输出时挂起。

我发现如果我尝试从另一个程序运行相同的提取可执行文件,如果我将目录指定为C:\ Documents and Settings \ username \ Local Settings \ Temp \ prog.exe,它就可以工作。但如果我将目录指定为C:\ DOCUME~1 \ USERNA~1 \ LOCALS~1 \ Temp \ prog.exe,我就会挂起。

有没有办法解析程序中的波浪号文件名,这样我就可以指定一个可以工作的目录名?

(因为我总是喜欢解决语言和API设计问题,Java File.createTempFile()和java.io.tmpdir有什么理由要评估到错误的文件名吗?)

2 个答案:

答案 0 :(得分:10)

您可以使用getCanonicalPath()来获取展开的路径。 E.g:

try
{
  File file = File.createTempFile("abc", null);
  System.out.println(file.getPath());
  System.out.println(file.getCanonicalPath());
}
catch (IOException e) {}

...生产......

C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\abc49634.tmp
C:\Documents and Settings\username\Local Settings\Temp\abc49634.tmp

我在XP上对此进行了测试,但假设它在其他Windows操作系统上的工作方式类似。

请参阅@ raviaw对第二个问题的回答。

答案 1 :(得分:3)

哇,我从未见过。事实是环境变量%TEMP%返回一个受损的名称(这是来自我的计算机):

TEMP=C:\DOCUME~1\raviw\LOCALS~1\Temp
TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp

假设一个新创建的java VM使用环境变量来获取临时文件夹位置,那么目录将被破坏不是VM的错误。

即使您尝试使用System.getenv()获取临时文件夹,仍然会遇到同样的问题。

我会确保:

  • 问题不是因为你有一个名为“prog.exe”的目录(基于你的问题,我假设这个);
  • 如果文件是“prog.exe”,如果它没有被任何其他程序使用(可能是防病毒软件);
  • 检查您的计算机是否理智(对于任何非Web应用程序且需要临时文件的应用程序,这将是一个非常严重的错误。)