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


Автор: Swatch 6.2.2008, 10:37
Добрый день

Создаю с программе временный файл. Пытаюсь его открыть вот так:
Код

String file_name = f.getCanonicalPath();
Runtime.getRuntime().exec("cmd /C start " + file_name);


пишет, что не может найти файл 'C:/Documents'. В переменной file_name строка "C:\Documents and Settings\swatch\Local Settings\Temp\attachement48409.doc"

пыталась открыть файл по уму через Desktop. вот так:
Код

Desktop desktop;
if (Desktop.isDesktopSupported()) {
  desktop = Desktop.getDesktop();
  try {
     desktop.open(f);
  } catch (IOException ex) {
      ex.printStackTrace();
  }
}                

Программа вообще закрывается, если пытаешься открыть картинку... если .док или .тхт, то открывает... 

Вопросы в следующем: почему файлики либо не находятся, либо не открываются??? и как их правильно открыть?!

Автор: Kangaroo 6.2.2008, 10:48
Цитата(Swatch @  6.2.2008,  09:37 Найти цитируемый пост)
почему файлики либо не находятся,

Пробел мешает, напиши так:
Код

String file_name = f.getCanonicalPath();
Runtime.getRuntime().exec("cmd /C start \"" + file_name + "\"");

Автор: Swatch 6.2.2008, 11:11
хммм.... открылась консоль, в которой написано:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Microsoftб 1985 - 2001.

D:\\Work\\program\client\dest\

Рабочая директория моей программы.... а файлик так и не открылся...:(

Автор: Kangaroo 6.2.2008, 11:31
Цитата(Swatch @  6.2.2008,  10:11 Найти цитируемый пост)
Рабочая директория моей программы.... а файлик так и не открылся...:( 

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

Тут два варианта:
1) Создавать темповый файл не в директории с пробелом
2) Идти на форум по Окошкам и там искать помощи

Автор: v2v 6.2.2008, 11:34
а без 
"cmd /C start" пробывала?

Добавлено через 31 секунду
только путь всё равно с кавычками ...

Автор: Swatch 6.2.2008, 11:53
без "cmd /C start" ничего не происходит:(

Автор: v2v 6.2.2008, 12:02
а так?
cmd /C "F:\Documents and Settings\User\Мои документы\file_name.extension"

Автор: Kangaroo 6.2.2008, 12:07
Цитата(v2v @  6.2.2008,  11:02 Найти цитируемый пост)
а так?
cmd /C "F:\Documents and Settings\User\Мои документы\file_name.extension" 

во, так работает  smile

Swatch, только консольное окошко мешает.. открывается на заднем фоне.

Автор: Swatch 6.2.2008, 12:13
хммм... а у меня все равно не работает... ничего не открывается...:(

Автор: LSD 6.2.2008, 13:40
Попробуй так:
Код

cmd start "" "C:\Documents and Settings\User\Мои документы\my.file"

или так:
Код

    ProcessBuilder builder = new ProcessBuilder("cmd", "start", file.getCanonicalPath());
    builder.redirectErrorStream(true);
    Process process = builder.start();
    InputStream in = process.getInputStream();
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1)
      System.out.write(buffer, 0, read);


Цитата(Swatch @  6.2.2008,  10:37 Найти цитируемый пост)
Программа вообще закрывается, если пытаешься открыть картинку... если .док или .тхт, то открывает... 

Какие нибудь ексепшены в консоль пишутся? Картинка ассоциирована с какой нибудь программой?

Автор: Swatch 6.2.2008, 14:07
в консоль падает вот это:
Код

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c80d189, pid=1800, tid=304
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0-b105 mixed mode, sharing)
# Problematic frame:
# C  [kernel32.dll+0xd189]
#
# An error report file with more information is saved as hs_err_pid1800.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
Java Result: 1


картинки пробовала и jpg, и gif, и bmp... обычно, когда смотрю картинки, они открываются ACDSee...

Добавлено через 8 минут и 47 секунд
вот так:
Код

Runtime.getRuntime().exec("cmd start \"" + file_name + "\"");

не помогло...

а вторым методом с ProcessBuilder, опять написалось в консоль:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Microsoftб 1985 - 2001.

D:\\Work\\program\client\dest\

Автор: LSD 6.2.2008, 14:26
Цитата(Swatch @  6.2.2008,  14:07 Найти цитируемый пост)
вот так:

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

Автор: Swatch 6.2.2008, 14:37
если я пытаюсь написать:
Код
    
Runtime.getRuntime().exec("cmd start  """+ file_name);

то от меня требуют, чтобы я закрыла скобку и поставила точку с запятой...

Автор: LSD 6.2.2008, 14:52
Код

Runtime.getRuntime().exec("cmd start \"\" \""+ file_name + "\"");

Автор: Swatch 6.2.2008, 15:05
и так пробовала... результат тот же: ничего не запускается...  smile 

Автор: dorogoyIV 6.2.2008, 15:37
начни с малого:
Код

   Runtime.getRuntime().exec("cmd /C calc.exe");
 хотя бы это работает?

Автор: Swatch 6.2.2008, 15:59
да, это работает...

Автор: LSD 6.2.2008, 16:04
У меня заработал такой вариант:
Код

Process process = Runtime.getRuntime().exec("cmd.exe /C start \"\" \"" + fileName + "\"");

Автор: Swatch 6.2.2008, 16:22
а где Вы потом этот process использовали?

у меня эта строка не работает... если просто одну строку писать...

Автор: dorogoyIV 6.2.2008, 16:24
Цитата(Swatch @  6.2.2008,  15:59 Найти цитируемый пост)
да, это работает...

тогда сделай файл с расширением file.bat
в этом файле напиши: cmd /C calc.exe (без всяких кавычек)
потом в своей проге:
Код

  File f=new File("file.bat");
  try
  {
//   String s=f.getCanonicalPath();
//   String s=f.getAbsolutePath();
   String s=f.getPath(); // у меня работает во всех трех вариантах

   Runtime.getRuntime().exec(s);
  }
  catch(Exception ex){}

если работает, то хотя бы понятно, что нет каких то левых ошибок  smile 

Автор: Swatch 7.2.2008, 08:12
калькулятор работает... а мои файлики так и не открываются...  smile 

Автор: dorogoyIV 7.2.2008, 12:07
Цитата(Swatch @  7.2.2008,  08:12 Найти цитируемый пост)
калькулятор работает... а мои файлики так и не открываются...   

попробуй в этом file.bat написать путь к своему файлу, не забывай про кавычки если есть пробелы в именах. (file.bat сам запускаемый, т.е. можешь кликать просто его)
получится что то вроде
cmd /C C:/"Program Files"/Far/Far.ico
можно просто путь писать
C:/"Program Files"/Far/Far.ico

Автор: LSD 7.2.2008, 13:19
Цитата(Swatch @  6.2.2008,  16:22 Найти цитируемый пост)
а где Вы потом этот process использовали?

Вот работающий пример:
Код

import java.io.*;

public class Test
{
  public static void main(String[] args) throws Exception
  {
    String fileName = "C:\\Documents and Settings\\All Users\\Документы\\Мои рисунки\\Образцы рисунков\\Закат.jpg";
    Process process = Runtime.getRuntime().exec("cmd.exe /C start \"\" \"" + fileName + "\"");
    new Spooler(process.getInputStream(), System.out).start();
    new Spooler(process.getErrorStream(), System.err).start();
    int result = process.waitFor();
    System.out.println("result = " + result);
  }

  private static class Spooler extends Thread
  {
    private InputStream in;
    private OutputStream out;

    private Spooler(InputStream in, OutputStream out)
    {
      this.in = in;
      this.out = out;
    }

    @Override
    public void run()
    {
      try
      {
        int read;
        byte[] buffer = new byte[1024];
        while((read = in.read(buffer)) != -1)
          out.write(buffer, 0, read);
      }
      catch(IOException e)
      {
      }
      finally
      {
        try
        {
          in.close();
        }
        catch(IOException e)
        {
        }
        try
        {
          out.close();
        }
        catch(IOException e)
        {
        }
      }
    }
  }
}

Если путь указать неправильный, то появится диалог с сообщением об ошибке: "Windows не удалось найти файл...".

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