# Runtime exec unter MacOS X will nicht "open pfad"



## Stefan1200 (28. Dez 2004)

Hi,

ich habe ein kleines Problem, mit einem Code, das unter Windows wunderbar funktioniert (natürlich nicht mit open).
Wenn ich aber unter MacOS X exakt folgenden Befehl durch Runtime exec ausführen will, bekomme ich nach einer Sekunde ein return code 1 zurück und er macht nichts:



> open "/Volumes/BlaBla/Ordner/"


Beispiel wenn der Datenträger "BlaBla" heisst und einen Ordner "Ordner" enthält.

Lasse ich mir exakt das mit System.out.println ausgeben, was Runtime Exec startet, und verwende dann diesen Befehl in der Terminal, öffnet open mir den Ordner. Hat jemand eine Idee, warum MacOS X bockig ist? ;-)
Ich streichel den iMac doch immer, aber er will nicht *g* ;-).

Es ist die neuste MacOS X Version mit neuster Java RE drauf.
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-141.3)
Java HotSpot(TM) Client VM (build 1.4.2-38, mixed mode)

Währe klasse, wenn mir jemand ein Tipp geben kann. Braucht Ihr ein Source?
Aus dem Kopf heraus müsste das so sein:


```
Runtime.getRuntime().exec("open "/Volumes/BlaBla/Ordner/");
```


----------



## Kerberus (28. Dez 2004)

Habe auch einen Mac und bei mir funktioniert es bestens. Habe folgenden Code verwendet:

```
import java.io.*;

public class Test {
 public static void main(String[] args) {
  try {
   File directory = new File(args[0]);
   if(directory.isDirectory() && directory.exists()) {
    System.out.println("Gültige URL");
   } else {
    System.out.println("Falsche URL");
    return;
   }
   String befehl = "open "+directory.getPath();
   System.out.println(befehl);
   Runtime.getRuntime().exec(befehl);
  } catch(IOException ioe) { 
   System.out.println(ioe.getMessage());
  }
 }
}
```

Nur wenn man die root-Partition ansprechen will, geht nichts mehr.


----------



## Stefan1200 (29. Dez 2004)

Danke für dein Tipp, doch leider sind die beiden Macs, auf denen ich das getestet habe, etwas besonderes ;-).
Und zwar habe ich das folgende simple Test Programm programmiert:


```
import java.io.*;
public class OpenTest
{
	public static void main(String[] args)
    {
		File dir = new File("");
		String command = "open \"" + dir.getAbsolutePath() + "\"";

	    try
		{
		    System.out.println(command);
		    Process p = Runtime.getRuntime().exec(command);
		    System.out.println("Exit: " + p.waitFor());
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
```

Leider wird kein Ordner geöffnet, und ich bekomme exakt folgende Ausgabe in der Terminal:



> open "/Volumes/OpenTestCD/OpenTest"
> Exit: 1



Gebe ich aber die Zeile



> open "/Volumes/OpenTestCD/OpenTest"



direkt in der Terminal ein, öffnet sich der Ordner, genau so wie es sein soll.
Um den Fall meiner größeren Anwendung zu rekonstruieren, befand sich dieses Programm auch in einer Jar Datei.
Ich verzweifle langsam, welchen Fehler habe ich gemacht?


----------



## Kerberus (29. Dez 2004)

Habe gefunden, was den Fehler verursacht:


```
String command = "open " + dir.getAbsolutePath();
```

Ich weiss zwar nicht wieso, aber die Anführungszeichen verursachen einen Fehler.


----------



## Stefan1200 (29. Dez 2004)

Gehen Spaces im Pfad unter MacOS X den ohne Anführungszeichen?

Grummel, unter Windows braucht man die, unter OSX gehen die nicht...


----------



## Kerberus (29. Dez 2004)

Auch unter MacOSX braucht man die, sonst wir der Pfad nicht richtig erkannt. Aber man sollte es so weit ich weiss wie folgt machen:
/Volumes/"Meine CD"/Datei/


----------



## Stefan1200 (29. Dez 2004)

Ich habe inzwischen ein Dutzend Versionen meines Testprogrammes erstellt.
Leider funktioniert das mit den Anführungszeichen gar nicht.
Auch der Trick das Space Zeichen zu Escapen, wie es die Terminal standardmäßig macht, geht nicht (\ ).

Im Moment funktioniert open nur bei Pfaden ohne Spaces, also ohne Anführungszeichen, dann arbeitet open korrekt.

Ich finde es grauenvoll, wie Apple es immer wieder schafft, die Java Runtime an einigen Stellen zu versauen.

Hat noch jemand eine Idee, wie man das doch hinbekommt?
Gibt es noch einen anderen Befehl unter OS X, um Ordner oder Dokumente zu öffnen?


----------



## Stefan1200 (30. Dez 2004)

Habe eine Lösung, geht auch unter Windows:
Den Pfad einfach in eine URL umwandeln.
Windows ist allerdings etwas anspruchsvoll, folgende Methode generiert aus einem normalen Pfad eine URL, die sowohl unter MacOS X als auch unter Windows funktioniert:


```
private String encodePath(String path)
    {
		StringBuffer sb;

		if (OS.indexOf("Windows") != -1)
		{
			sb = new StringBuffer("file:///" + path);
		}
		else if (OS.indexOf("Mac OS X") != -1)
		{
			sb = new StringBuffer("file://" + path);
		}
		else
		{
			sb = new StringBuffer("file://" + path);
		}

		int pos1 = 0;

		while (true)
		{
			pos1 = sb.indexOf(" ", pos1);
			if (pos1 == -1)
			{
				break;
			}

			sb.replace(pos1, ++pos1, "%20");
		}

		return sb.toString();
	}
```


----------

