Как я неискажаю имена файлов Windows в Java?

От 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 должен оценить к искаженным именам файлов?)

6
задан skiphoppy 25 March 2010 в 18:54
поделиться

2 ответа

Вы можете использовать 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 на ваш второй вопрос.

10
ответ дан 8 December 2019 в 18:34
поделиться

Вау, я такого не видел. Дело в том, что переменная среды% TEMP% возвращает искаженное имя (это с моего компьютера):

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

Предполагая, что вновь созданная виртуальная машина Java использует переменную среды для получения местоположения временной папки, виртуальная машина не виновата в том, что каталоги приходят в искаженном виде.

И даже если вы попытаетесь использовать System.getenv () для получения временной папки, у вас все равно будет та же проблема.

Я бы хотел убедиться, что:

  • Проблема не вызвана тем фактом, что у вас есть каталог с именем "prog.exe" (исходя из вашего вопроса, я предполагаю это);
  • Если файл "prog.exe", если он не использовался какой-либо другой программой (например, антивирусом);
  • Проверка работоспособности вашего компьютера (это была бы очень критическая ошибка для любого приложения, не являющегося веб-приложением и которым нужны временные файлы).
3
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: