От 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 должен оценить к искаженным именам файлов?)
Вы можете использовать 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 на ваш второй вопрос.
Вау, я такого не видел. Дело в том, что переменная среды% TEMP% возвращает искаженное имя (это с моего компьютера):
TEMP=C:\DOCUME~1\raviw\LOCALS~1\Temp TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp
Предполагая, что вновь созданная виртуальная машина Java использует переменную среды для получения местоположения временной папки, виртуальная машина не виновата в том, что каталоги приходят в искаженном виде.
И даже если вы попытаетесь использовать System.getenv () для получения временной папки, у вас все равно будет та же проблема.
Я бы хотел убедиться, что: