6

从 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 必须评估损坏的文件名?)

4

2 回答 2

10

您可以使用getCanonicalPath()来获取扩展路径。例如:

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 对您的第二个问题的回答。

于 2010-03-25T19:02:26.807 回答
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 应用程序且需要临时文件的应用程序来说,这将是一个非常严重的错误)。
于 2010-03-25T19:05:30.333 回答