2013-12-16 3 views
6

Я хочу, чтобы найти EXE-файлы путь в Java программно, например:Найти путь к исполняемому файлу программно и быстро

  • Skype.exe вводится в программу, чтобы найти прямой путь к нему
  • Программа делает алгоритм, который находит путь к файлу
  • Программа возвращает путь к файлу C: \ Users \ Public \ Desktop \ Skype.exe

способ Я попытался не перебирать системы файлов до «скайп .exe "найдено , но это занимает много времени и ресурсов.

Есть ли какой-либо взлом, который может сделать его почти мгновенным, например, как функция Win_Api/cmd или сортирует файловую систему до тех пор, пока программа не будет найдена единственным способом?

+1

Приоритезация общих местоположений исполняемых файлов может помочь ускорить это в средней системе. Кроме этого у меня ничего нет. – DeathByTensors

+0

Единственный способ, которым я могу думать, что это делается своевременно, - использовать [Jawin] (http://jawinproject.sourceforge.net/) для взаимодействия с библиотеками Windows, а затем реализовать что-то похожее на функцию поиска «Меню« Пуск » который работает с недавно полученными файлами и сокращениями, присутствующими в 'C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs'. Можете даже сделать это с помощью библиотек Windows. Разумеется, необходимы дополнительные исследования. –

+0

Ищите какие-либо файлы 'exe', или же решение, которое очень быстро находит« установленных »' exe' файлов достаточно? –

ответ

1

Я действительно нашел что-то, что работает, хотя и не самый быстрый, но занимает всего около 100 мс - 500 мсек в зависимости от exe.

Для этого вам необходимо использовать процесс выполнения.

В основном вы идете в корень вашего диска, а затем ищите файловую систему, используя эти команды в cmd.

cd \ 
dir /s /b mytool.exe 

Это вернет путь к файлу.

Мой код для него:

(хаком я знаю)

try { 
     Process p = Runtime.getRuntime().exec("./res/getPrograms.bat " + exeName); 
     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 
     while(true) { 
      line = input.readLine(); 
      if(line == null) { 
       break; 
      } 
      System.out.println(line); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

И .bat файл (я передаю параметр «eclipse.exe» в файл летучая мышь, которая представлена ​​в% 1):

cd \ 
dir /s /b %1 
exit 

выходной сигнал становится:

C:\Users\Mitchell\workspace\Remote Admin>cd \ 

C:\>dir /s /b eclipse.exe 
C:\eclipse\eclipse.exe 
1

В качестве расширения к @Minor's answer, если вы хотите увеличить производительность, ограничив поиск только теми программами, которые в настоящее время установлены в Windows, следующие разделы реестра содержат информацию о «установленных» программах.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 

С помощью powershell вы можете получить доступ к свойствам установленного программного обеспечения, хранящегося в этих ключах. Особый интерес представляет здесь IntallLocation.

Затем вы просто модифицируете свой Java-код, чтобы использовать другой пакетный скрипт, который извлекает эти места установки, и специально предназначенный для этих мест установки для файлов exe.

getInstalledPrograms.bat

@echo off 
powershell -Command "Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object {$_.DisplayName -match \"%1\"} | Select-Object -Property InstallLocation" 
exit 

getPrograms.летучая

@echo off 
cd %1 
dir /b /s "*%2*.exe" 
exit 

Java Пример:

String search = "skype"; 
try { 
    Process getInstalled = Runtime.getRuntime().exec("./src/getInstalledPrograms.bat " + search); 
    BufferedReader installed = new BufferedReader(new InputStreamReader(getInstalled.getInputStream())); 
    String install; 
    String exe; 
    int count = 0; 
    while(true) { 
     install = installed.readLine(); 
     if(install == null) { 
      break; 
     } 
     install = install.trim(); 
     // Ignore powershell table header and newlines. 
     if(count < 3 || install.equals("")) { 
      count++; 
      continue; 
     } 
     Process getExes = Runtime.getRuntime().exec("./src/getPrograms.bat " + "\"" + install + "\""); 
     BufferedReader exes = new BufferedReader(new InputStreamReader(getExes.getInputStream())); 
     while(true) { 
      exe = exes.readLine(); 
      if(exe == null) { 
       break; 
      } 
      exe = exe.trim(); 
      System.out.println(exe); 
     } 
    } 

} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

В настоящее время мой пример Java дублирует InstallLocations возвращенное getInstalledPrograms.bat, хотя сценарий отлично в ЦМД работает. Концептуально, но это решение звучит.

0

Если вы хотите узнать, что исполняемый файл WHICH выполняется из командной строки при вводе. Используйте который/где команды ..

Unix/Linux/Mac OSX Possix < который>

который CHMOD который кд которых левая шкала которая MyProgram

возвращает ничего не возвращает, если нет такого файл программы существует.

для Windows использовать где < где> /? для справки по этой команде

Если у вас нет исполняемого файла, но псевдонима или какое-то функции среды/процедур/команда оболочки .. использовать < типа> команду на Unix/Linux/Mac OS X. Это скажет вам, если вы имеете дело с псевдонимом, функцией среды или исполняемым файлом.

Смежные вопросы