2009-06-22 22 views
16

Czy jest tak w Javie, aby dowiedzieć się, czy dana ścieżka jest absolutna, czy nie, niezależnie od platformy, na której program jest obecnie uruchomiony. Więc, co ja chcę, to prawdopodobnie coś jak w poniższym przykładzie:Java: Jak sprawdzić, czy ścieżka jest bezwzględna, niezależnie od systemu operacyjnego.

W systemie Linux:

new File("/home/").isAbsolute() // Should return true. 
new File("C:/My Documents").isAbsolute() // Should *also* return true. 

W systemie Windows:

new File("C:/Documents").isAbsolute() // Should return true. 
new File("/home/").isAbsolute() // Should *also* return true. 

mogę kod prawdopodobnie coś obejść się z tym, ale ja chciałem tylko dowiedzieć się, czy ktoś zna wbudowaną klasę dostarczoną w Javie, aby rozwiązać ten problem. Czy ktoś może kiedykolwiek mieć ten problem? I jak to rozwiązałeś?

Dzięki!

+1

na Linuksie, jak ścieżka "c:/My Documents" jest prawdopodobnie nieważne, a to z pewnością nie jest absolutna. W systemach implementujących standard posix wszystkie ścieżki istnieją poniżej pojedynczego "katalogu głównego", a zatem ścieżka bezwzględna zaczyna się od tego katalogu głównego. Tak więc absolutna ścieżka zawsze zaczyna się od "/". cokolwiek innego jest brane pod uwagę w stosunku do bieżącego katalogu roboczego procesu. W systemie Linux "C:/..." oznacza katalog wewnątrz bieżącego katalogu roboczego o nazwie "C:", co jest najprawdopodobniej bzdurą. – SingleNegationElimination

+1

Twoje pytanie ma mało sensu. Wyobraź sobie hipotetyczny system operacyjny, w którym wszystkie ścieżki są absolutne. Powiedzmy, że w tym systemie operacyjnym jest Java. Aby spełnić twoje wymagania, potrzebujesz metody isFileAbsolute(), która zawsze zwraca wartość true, niezależnie od platformy, na której program jest aktualnie uruchomiony. Łatwy do wdrożenia, ale bez znaczenia. –

+0

Mam sytuację, w której użytkownik konfiguruje katalog roboczy na komputerze zdalnym. Na komputerze zdalnym może działać system Unix lub Windows (choć najczęstszym scenariuszem jest komputer lokalny, a system zdalny to urządzenie unix). Ścieżka podana przez użytkownika musi zostać zweryfikowana i wymagane jest ustalenie, czy ścieżka jest bezwzględna. –

Odpowiedz

10

Nie.

Istnieją pewne bazowe FileSystem klas (to Java 7, ale istnieją one przed nim, jak również), które narażają isAbsolute(), ale nie są one publiczne - więc nie powinno z nich korzystać, a nawet jeśli Twój kod byłby pełen odblasków - i tylko "poprawne" wersje OS są zawarte w JRE, więc i tak musiałbyś je kodować.

Oto implementacje języka Java 7 w isAbsolute (...), aby zacząć. Zauważ, że File.getPrefixLength() jest pakietem prywatnym.

Win32FileSystem:

public boolean isAbsolute(File f) 
{ 
     int pl = f.getPrefixLength(); 
     return (((pl == 2) && (f.getPath().charAt(0) == slash)) 
       || (pl == 3)); 
} 

UnixFileSystem:

public boolean isAbsolute(File f) 
{ 
     return (f.getPrefixLength() != 0); 
} 
+9

Pamiętaj, że po sześciu latach ta odpowiedź jest nieaktualna. W dzisiejszych czasach klasa File zawiera metodę "[isAbsolute()] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute)", która robi dokładnie to, co ty " d oczekiwać: _ "Sprawdza, czy ta abstrakcyjna ścieżka jest bezwzględna. Definicja bezwzględnej ścieżki jest zależna od systemu.W systemach UNIX nazwa ścieżki jest absolutna, jeśli jej prefiks to"/".W systemach Microsoft Windows nazwa ścieżki jest absolutna, jeśli jej prefiks to specyfikator dysku, po którym następuje "\\", lub jeśli jego prefiks to "\\\\" _ – Guus

-1

skończyło się za pomocą tego (w Javie 6):

private static boolean testPath(String path) { 
    int prefixLen = FilenameUtils.getPrefixLength(path); 
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)) 
     return true; 
    else 
     return false; 
} 

private static boolean testPathWin(String path, int prefixLen) { 
    if (prefixLen == 3) 
     return true; 
    File f = new File(path); 
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/')) 
     return true; 
    return false; 
} 

private static boolean testPathLinux(int prefixLen) { 
    return (prefixLen != 0); 
} 
+0

Skopiowałeś implementację Boolean Java 7 isAbsolute (File f) dla okien, ale używasz Apache commons FilenameUtils.getPrefixLength() method Implementacja Java 7 i implementacja funkcji getPrefixLength() Apache nie są takie same.W przypadku ścieżek UNC apache zwróci "\\ foo \ poo" -> "\\ foo \" jako prefiks, a długość będzie 6 – acheron55

+0

@ Acheron55: I don nie rozumiem, gdzie "isAbsolute()", do którego się odnosisz? Gdzie jest dokładnie w moim fragmencie źródłowym? – stuhpa

+0

sprawdź t on kod źródłowy FilenameUtils.getPrefixLength (path). Może zwracać dowolną liczbę długości ścieżek UNC. Ale sprawdzasz tylko długość 2 lub 3 w metodzie testPathWin. Więc jest źle. Byłoby prawdą, gdybyś mógł użyć jego implementacji java. Ponieważ zwraca tylko 0,1,2,3 wartości. Również ten wiersz: 'if (testPathWin (ścieżka, prefixLen) || testPathLinux (prefixLen))' sprawdzenie linuksa sprawi, że twoja metoda Windows będzie bezużyteczna, ponieważ ma znacznie szerszy zakres. Powiedzmy, że twoja długość wynosi 1 dla ścieżki Windows, ale twoja metoda testPath nadal zwraca wartość true, która jest fałszywa – acheron55

3

Moja pęknięć w tym przy użyciu Apache FilenameUtil -

public static boolean isAbsolute(final String path) { 
     return FilenameUtils.getPrefixLength(path) != 0; 
    } 

Technicznie to powraca! Relative. Co jest w porządku dla moich celów.

8

W Javie 7:

new File(path).isAbsolute() 
Powiązane problemy