Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > получит путь к прграмме на различных ОС


Автор: Samotnik 8.10.2009, 15:19
Привет. 
Нужно на Java получить путь к программе (к файлу запускающую эту программу). 
Т.е.  к примеру:  нужно java средствами получить путь к  Фотошопу, или путь к Ворду, или к Винампу  и т.д.
При том что нужно  это сделать для Windows, Linux, MacOS smile 
 smile 

Автор: sergioK 9.10.2009, 00:16
Цитата(Samotnik @ 8.10.2009,  15:19)
Привет. 
Нужно на Java получить путь к программе (к файлу запускающую эту программу). 
Т.е.  к примеру:  нужно java средствами получить путь к  Фотошопу, или путь к Ворду, или к Винампу  и т.д.
При том что нужно  это сделать для Windows, Linux, MacOS smile 
 smile

сначала выясняешь какая ОС 
Код

 public static void main(String[] args)
    {
      Collection list=newHash();
       map.put("win","winCommand");
      map.put("mac","macCommand");
     map.put("linux","LinuxCommand");     // 

     
       String  os = System.getProperty( "os.name").trim().toLowerCase();   // это защита от дураков  :-D 
       Runtime.getRuntime().exec(map.get(os));
       }

 
 хотя код может и неработать, писал  из головы,   да и проверь на каждой системе что она дает при вызове  
Код

   System.getProperty( "os.name");
и результат пиши в мэп  
  



Автор: Samotnik 12.10.2009, 10:46
sergioK,  и что это такое ? smile Ваш кусок кода поможет реализовать то, что написанно в названии топика ? 
Вобщем, для Windows  я разобрался, там нужно была работа с реестром, c помощью http://www.rgagnon.com/javadetails/java-0480.html 
Теперь остается вопрос, как тоже самое реализовать на MacOS ?  smile 

Автор: sergioK 12.10.2009, 11:04
Цитата(Samotnik @ 12.10.2009,  10:46)
sergioK,  и что это такое ? smile Ваш кусок кода поможет реализовать то, что написанно в названии топика ? 
Вобщем, для Windows  я разобрался, там нужно была работа с реестром, c помощью http://www.rgagnon.com/javadetails/java-0480.html 
Теперь остается вопрос, как тоже самое реализовать на MacOS ?  smile

сорри перепутал отвечал на вопрос из другой ветки здесь 

Автор: Samotnik 12.10.2009, 11:07
Цитата(sergioK @  12.10.2009,  11:04 Найти цитируемый пост)
сорри

да ничего smile  smile 


Автор: LSD 13.10.2009, 11:52
Вопрос составлен так, что вообще нефига не понятно. К какой программе нужно получить путь? Откуда вообще берутся эти программы?

Автор: Samotnik 13.10.2009, 12:12
Цитата(LSD @  13.10.2009,  11:52 Найти цитируемый пост)
Вопрос составлен так, что вообще нефига не понятно. К какой программе нужно получить путь? Откуда вообще берутся эти программы? 

Ну смотри, есть метод openFile(String name_of_programm, String name_of_file)
Этот метод, должен открыть тот файл, который пришел к нему в параметрах, в программе, которая тоже пришла в параметрах. На разных ОС.
Метод принимает два параметра, имя программы и имя файла.  

Очень простой пример : 
Код


public static void main (String ... args) {
openFile("photoShop", "1.jpg");
}
.....
openFile (String np, String nf) {
if (np.equals("photoshop")) {
то вот тут нужно написать код, который откроет файл 1.jpg в Фотошопе
}
}

и так далее.
Теперь более понятно ?

Автор: AlexeyVorotnikov 13.10.2009, 12:41
Цитата(Samotnik @  13.10.2009,  13:12 Найти цитируемый пост)
Теперь более понятно ? 

Не совсем. Что есть имя программы?

Автор: Skynin 13.10.2009, 13:13
2 AlexeyVorotnikov
Как понял человек хочет запустить программу установленную на десктопе с набором нужных параметров.
Утрировано - сформировать нужные аргументы для java.lang.Runtime.exec

Автор: sergioK 13.10.2009, 13:28
Цитата(Samotnik @ 13.10.2009,  12:12)
Цитата(LSD @  13.10.2009,  11:52 Найти цитируемый пост)
Вопрос составлен так, что вообще нефига не понятно. К какой программе нужно получить путь? Откуда вообще берутся эти программы? 

Ну смотри, есть метод openFile(String name_of_programm, String name_of_file)
Этот метод, должен открыть тот файл, который пришел к нему в параметрах, в программе, которая тоже пришла в параметрах. На разных ОС.
Метод принимает два параметра, имя программы и имя файла.  

Очень простой пример : 
Код


public static void main (String ... args) {
openFile("photoShop", "1.jpg");
}
.....
openFile (String np, String nf) {
if (np.equals("photoshop")) {
то вот тут нужно написать код, который откроет файл 1.jpg в Фотошопе
}
}

и так далее.
Теперь более понятно ?


а так не работает ? или это только для винды ?
Код

    public void view (){
         Desktop desktop= Desktop.getDesktop();
         File file=new File("atext.txt");
         try {
         desktop.open(file);        
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        
    }


хотя Я тоже подумал как Skynin
т,е ,  как открыть файл в определенной программе на конкретной ОС,  (это другой форум  smile ) 
т,е, как сформировать командную  строку случае окон ( cmd  notepad myFile.txt) 


к модераторам 
это надо добавить в список часто задаваемых вопросов, IMHO








Автор: LSD 13.10.2009, 13:31
Цитата(Samotnik @  13.10.2009,  12:12 Найти цитируемый пост)
Этот метод, должен открыть тот файл, который пришел к нему в параметрах, в программе, которая тоже пришла в параметрах. На разных ОС.
Метод принимает два параметра, имя программы и имя файла.

Это называется ассоциированая команда. Вообщем и целом это никак не стандартизованно, более того каждая графическая среда может иметь свои настройки.

Для Windows это делает так:
Код

C:\>assoc .docx
.docx=Word.Document.12

C:\>ftype Word.Document.12
Word.Document.12="C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /n /dde

Для MacOS узнавай команды на форуме по MacOS. К Java эта проблема отношения не имеет.


P.S. Кстати, а http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html#open%28java.io.File%29 не устроит?

Автор: Samotnik 13.10.2009, 16:23
Вижу, что не совсем понятно обьяснил ... 
Вобщем вот, как я сделал, для того чтобы открыть  Аутлук и ОпенОфис на windows
Код

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;

public class UsingReg {

  private static final String REGQUERY_UTIL = "reg query ";
  private static final String REGSTR_TOKEN = "REG_SZ";    
  
  private static final String OPENOFFICE_FOLDER_CMD = REGQUERY_UTIL +
    "\"HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\"
     + "App Paths\\soffice.exe\" ";
  
  private static final String MSOUTLOOK_FOLDER_CMD = REGQUERY_UTIL +
    "\"HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\"
    + "App Paths\\OUTLOOK.exe\" ";
  
  static class StreamReader extends Thread {
    private InputStream is;
    private StringWriter sw;

    StreamReader(InputStream is) {
      this.is = is;
      sw = new StringWriter();
    }

    public void run() {
      try {
        int c;
        while ((c = is.read()) != -1)
          sw.write(c);
        }
        catch (IOException e) { 
         e.printStackTrace();
        }
      }

    String getResult() {
      return sw.toString();
    }
  }
  
  protected static void openOOFile(String name) 
  {
        try {
            Process process = Runtime.getRuntime().exec(OPENOFFICE_FOLDER_CMD);
            StreamReader reader = new StreamReader(process.getInputStream());          
            
            reader.start();
            process.waitFor();
            reader.join();

            String result = reader.getResult();
            int p = result.indexOf(REGSTR_TOKEN);            
            
            if (p == -1)
             throw new Exception("No record in this registry");
           
            int start = p + REGSTR_TOKEN.length();
            int end = result.substring(p + REGSTR_TOKEN.length()).trim().indexOf("\n") + start; 
            String res = result.substring(start, end).trim();        
            Runtime.getRuntime().exec(new String[]{res, "\"\"" + name + "\"\""});
          }
          catch (Exception e) {
            e.printStackTrace();
          }
   }
  
  protected static void openMSOFile(String name) 
  {
        try {
            Process process = Runtime.getRuntime().exec(MSOUTLOOK_FOLDER_CMD);
            StreamReader reader = new StreamReader(process.getInputStream());          
            
            reader.start();
            process.waitFor();
            reader.join();

            String result = reader.getResult();
            int p = result.indexOf(REGSTR_TOKEN);            
            
            if (p == -1)
             throw new Exception("No record in this registry");
            String tmp = result.substring(p + REGSTR_TOKEN.length()).trim();
            String strMain = tmp.substring(tmp.indexOf(REGSTR_TOKEN) + REGSTR_TOKEN.length()).trim();       
            Runtime.getRuntime().exec(new String[]{strMain, "/f", name});
            
          }
          catch (Exception e) {
            e.printStackTrace();
          }
   }
  
  protected static File whichOOffice() {
      try {
          Process which = Runtime.getRuntime().exec("which openoffice");
          BufferedReader reader = new BufferedReader(new InputStreamReader(which.getInputStream()));
          return new File(reader.readLine());
      } catch (IOException e) {
          throw new RuntimeException(e);
      }
  }
}

вот таким образом я запускаю эти программы, на виндовс  smile
терь нужно каким то образом запустить на Маках 

Автор: Skynin 13.10.2009, 18:17
Цитата

терь нужно каким то образом запустить на Маках 

Узнать точно так же как про "reg query " узнали. Java тут ни при чем.

Я кстати только что узнал о такой возможности Windows smile

Автор: LSD 14.10.2009, 14:33
Цитата(Samotnik @  13.10.2009,  16:23 Найти цитируемый пост)
Вобщем вот, как я сделал, для того чтобы открыть  Аутлук и ОпенОфис на windows

А если человек пользуется portable версией OpenOffice то будет epic fail smile

Ну и самое главное, это то, что к Java эта проблема отношения не имеет.

Автор: Samotnik 14.10.2009, 14:53
Цитата(LSD @  14.10.2009,  14:33 Найти цитируемый пост)
А если человек пользуется portable версией OpenOffice то будет epic fail

which solution ? 

Цитата(LSD @  14.10.2009,  14:33 Найти цитируемый пост)
Ну и самое главное, это то, что к Java эта проблема отношения не имеет. 

ну как это ? smile  А может уже кто-нибудь делал что-то подобное ?

Автор: LSD 14.10.2009, 15:02
Цитата(Samotnik @  14.10.2009,  14:53 Найти цитируемый пост)
which solution ?

Для начала перестать играть в "Штирлиц в застенках гестапо" и наконец рассказать поподробней о проблеме. В чем вообще смысл этого метода, как и зачем он будет вызываться. Потому как решения в лоб кривые и не портабельные.


Если для примера взять тот же FAR/Total Commander, то там пользователь может вручную указать программу которой надо открывать тот или иной тип файлов (указав путь к программе и параметры запуска), а если он этого не сделал, то будут использоваться системные ассоциации.

Автор: serger 14.10.2009, 15:04
Цитата(Samotnik @  14.10.2009,  14:53 Найти цитируемый пост)
ну как это ? smile  А может уже кто-нибудь делал что-то подобное ? 

У тебя есть шанс открыть новый проект на apache.. Runner4j. smile 

ps. Там (на сайте apache) чего-то похожего не видел.. Интересно - пиши дальше.

Добавлено через 1 минуту и 30 секунд
Цитата(LSD @  14.10.2009,  15:02 Найти цитируемый пост)
Если для примера взять тот же FAR/Total Commander, то там пользователь может вручную указать программу которой надо открывать тот или иной тип файлов (указав путь к программе и параметры запуска), а если он этого не сделал, то будут использоваться системные ассоциации. 

Как я понял - он и хочет "использовать системные ассоциации". Я прав?

Автор: Samotnik 14.10.2009, 15:16
LSD,  Окей, Вадя,  вот перед тобой стоит задача. 
Написать порграмму(в виде: метод, класса, поректа, программы, енама, ....,  не важно что) на Java, которая  будет выполнять следущее:
Пользователь при запуске твоей программы, передает два параметра туда,   Файл (который хочет открыть) и Программу (В которой хочет открыть этот файл).  И эта твоя порграмма должна работатать на всех ОС. smile 
Т.е. 
Я запускаю твою программу, и ввожу файл : d:\1.jpg и программу, в которой я хочу чтобы файл открылся : (Photoshop 
Затем клацаю   Ентер и передомною открывается Фотошоп, а внем моя картиночка smile
Вот собственно такое легкое заданице smile

Автор: serger 14.10.2009, 15:31
Цитата(Samotnik @  14.10.2009,  15:16 Найти цитируемый пост)
Я запускаю твою программу, и ввожу файл : d:\1.jpg и программу, в которой я хочу чтобы файл открылся : (Photoshop 
Затем клацаю   Ентер и передомною открывается Фотошоп, а внем моя картиночка smile

Ну сделай через справочник.

Автор: LSD 14.10.2009, 15:47
Цитата(Samotnik @  14.10.2009,  15:16 Найти цитируемый пост)
Окей, Вадя,  вот перед тобой стоит задача. 
Написать порграмму(в виде: метод, класса, поректа, программы, енама, ....,  не важно что) на Java, которая  будет выполнять следущее:
Пользователь при запуске твоей программы, передает два параметра туда,   Файл (который хочет открыть) и Программу (В которой хочет открыть этот файл).  И эта твоя порграмма должна работатать на всех ОС. smile 
Т.е. 
Я запускаю твою программу, и ввожу файл : d:\1.jpg и программу, в которой я хочу чтобы файл открылся : (Photoshop 
Затем клацаю   Ентер и передомною открывается Фотошоп, а внем моя картиночка smile
Вот собственно такое легкое заданице

Теперь мы взглянули на эти яйца сбоку, прогресс на лицо smile 



Я вообще не понимаю как твоя программа должна устанавливать ассоциации между именем и исполняемым файлом? Напишет тебе юзер:
D:\abc.xslt открыть Xalan, и че ты будешь делать? Как узнать где он находится? Как понять что Xalan-J запускается через java.exe? Как узнать формат командной строки Xalan-J?

Автор: Samotnik 14.10.2009, 15:51
LSD, нет, это мы не разбираем, это уже пордуманно. 
т.е.  нужно предположить, что ситуация идеальная smile  Я же привел пример.  Пользователь не будет вводиьт что ненужно, он будет вводить только то что нужно ! 
т.е.  
картинку открывать -  фотошопом, 
текстовый документ -  опенофисом,
пдф - пдф ридером. 
и т.д. 



Автор: serger 14.10.2009, 16:22
Цитата(Samotnik @  14.10.2009,  15:51 Найти цитируемый пост)
LSD, нет, это мы не разбираем, это уже пордуманно. 
т.е.  нужно предположить, что ситуация идеальная smile  Я же привел пример.  Пользователь не будет вводиьт что ненужно, он будет вводить только то что нужно ! 
т.е.  
картинку открывать -  фотошопом, 
текстовый документ -  опенофисом,
пдф - пдф ридером. 
и т.д. 


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

Автор: Samotnik 14.10.2009, 17:45
ок, вопрос решен. Всем спасибо ! 
Best reagrds, Andy ! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)