Mate pravdu - ten povodny kod robi problemy. Tu je upraveny kod, ktory som otestoval na Windows aj na MacOS:

package uritestapp;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 *
 * @author Marek Potociar (marek.potociar at sun.com)
 */
public class Main {
public static void main(String[] args) throws IOException, URISyntaxException {

String myAbsolutePathString = System.getProperty("user.home") + "/tmp/test.txt";

        File myFile = new File(myAbsolutePathString);
        URI myPath = myFile.toURI();

URI rootPath = File.listRoots()[1].toURI(); // "C:" is the second FS root on my Windows
        URI relativePath = rootPath.relativize(myPath);
        System.out.println(relativePath.toString());
    }
}

Jediny problem spociva v najdeni spravneho FS rootu. Na mojom laptope mam pod MacOS hlavny FS root namountovany ako prvy ( File.listRoots() [0] ), pod Windows mam "C:" namountovany ako druhy v poradi ( File.listRoots()[1] ).

...ale ak tvrdite, ze ste uz nasli lepsi sposob, ktory bude vo vseobecnosti fungovat, tak tuto diskusiu samozrejme nema zmysel predlzovat.

S pozdravom,
Marek Potočiar


On 29.10.2008, at 13:05, Lukáš Zapletal wrote:

      String myAbsolutePathString = System.getProperty("user.home") +
"/tmp/test.txt"; // premenna ktoru chceme relativizovat

      File myFile = new File(myAbsolutePathString);
      URI myPath = new URI(myFile.getCanonicalPath());

URI rootPath = new URI(File.listRoots() [0].getCanonicalPath()); // pri ziskavani rootu treba vo vseobecnosti pocitat s tym, ze FS rootov moze
byt viac...
      URI relativePath = rootPath.relativize(myPath);

      System.out.println(relativePath.toString()); // kontrolny vypis

Tento kod nemuze na Windows fungovat, protoze konstruktur URI(String)
ocekava obycejna lomitka, tak, jak to definuje specifikace URI-path.
Volani myFile.getCanonicalPath() ovsem vraci na Windows ta opacna
lomitka, cimz dostaneme URISyntaxException.

Ciste hypoteticky, kdyby kod fungoval (napriklad na UNIXu), to neni
to, co jsem potreboval, protoze volani URI.toString() vraci
"file:/...." a to ja nechci.

Diky za komentar, ja bych toto tema uz uzavrel. Vysledku jsme se v
tomto dlouhem threadu dopidili.

--
Lukas Zapletal
http://lukas.zapletalovi.com

Odpovedet emailem