从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有什么理由要评估到错误的文件名吗?)
答案 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=C:\DOCUME~1\raviw\LOCALS~1\Temp TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp
假设一个新创建的java VM使用环境变量来获取临时文件夹位置,那么目录将被破坏不是VM的错误。
即使您尝试使用System.getenv()获取临时文件夹,仍然会遇到同样的问题。
我会确保: