Slyh: Das System kann die Datei nicht finden

Beitrag lesen

Hallo,

Danke Daniel.
Die Datei soll plausible Daten (Highscore) beinhalten. Die ist für alle Benutzer gleich. Also ich denke, die soll einem Programmverzechnis liegen, z.B. save/bestenliste.txt

Und das wäre eine Information gewesen, die schon deutlich früher hätte
kommen können.

Also, erstmal ist der vorgesehene Pfad für Benutzerdaten in eigentlich
jedem Betriebssystem _nicht_ das Programmverzeichnis. Leider kommt man
mit Java direkt aber auch nicht an das Datenverzeichnis aller Benutzer
ran. (Unter Windows wäre dies z.B. C:\Dokumente und Einstellungen\All
Users\Anwendungsdaten)

Das Problem mit aktuellen Arbeitsverzeichnissen ist, daß sie nicht mit
dem Installationsverzeichnis übereinstimmen müssen. Du kannst deine
Applikation z.B. auch aufrufen, wenn du dich gerade im Verzeichnis c:\temp
befindest, obwohl dein Programm unter F:\Programme\MeinSpiel\ installiert
ist.

Davon abgesehen, gibt es nicht auf jedem Betriebssystem ein aktuelles
Arbeitsverzeichnis. WinCE kennt beispielweise gar kein aktuelles
Arbeitsverzeichnis. Dort ist immer Root () das Arbeitsverzeichnis.

In C kommt man u.U. an das Verzeichnis, in dem sich auch die zur Zeit
laufende EXE befindet, ran. Unter Java kann man meistens auch rausfinden,
von welcher Stelle eine .class-Datei ausgeführt wird.

Ich hatte hierzu schonmal was geschrieben.

Problem: Eine .class-Datei muß nicht zwingend von einem Datenträger
geladen worden sein, sondern könnte auch über eine URL bezogen oder gar
dynamisch generiert worden sein.

Ich poste trotzdem mal (ohne Funktionsgarantie!) einen Code, der das
Verzeichnis ermitteln kann, in dem sich die Klasse befindet, in dem
sich diese Methode befindet. Wenn sich die Klasse in einem JAR befindet,
wird das Verzeichnis zurückgeliefert, wo sich das JAR-Archiv befindet.

Der Code funktioniert mit ziemlicher Sicherheit nicht auf allen Plattformen
und schon gleich gar nicht, wenn die .class-Datei über eine URL oder
anderweitig erzeugt wurde.

  
protected File findInstallationDirectory() throws InstallationDirectoryNotFound  
{  
    CodeSource classCodeSource = getClass().getProtectionDomain().getCodeSource();  
    if (classCodeSource == null) {  
        throw new InstallationDirectoryNotFound("Code Source is null");  
    }  
  
    URL classLocation = classCodeSource.getLocation();  
  
    if (classLocation.getProtocol().equals("file")) {  
        // Use file:// URL as is.  
        try {  
            installationDirectory = new File(classLocation.toURI());  
        } catch (URISyntaxException e) {  
            throw new InstallationDirectoryNotFound("URISyntaxException: " + e);  
        }  
  
    } else if (classLocation.getProtocol().equals("jar")) {  
        // Extract file:// URL of JAR file from URL (jar:file:/c:/path/file.jar!/file.class)  
  
        // getPath() cuts away "jar:". (-> file:/c:/path/file.jar!/file.class)  
        String path = classLocation.getPath();  
  
        // Remove file.class. Separator is "!/". (-> file:/c:/path/file.jar)  
        int sheSlashPos = path.lastIndexOf("!/");  
        if (sheSlashPos != -1) {  
            path = path.substring(0, sheSlashPos);  
        }  
  
        return new File(path);  
    }  
  
    // Neither "file" nor "jar" protocol.  
    throw new InstallationDirectoryNotFound("Game class is neither a file nor inside a JAR archive.");  
}  

Gruß
Slyh