2009-06-22 5 views
16

Gibt es trotzdem in Java, ob der angegebene Pfad absolut ist oder nicht, unabhängig von der Plattform, auf der das Programm gerade ausgeführt wird. Also, was ich will, ist wahrscheinlich so etwas wie das folgende Beispiel:Java: Wie finde ich heraus, ob der Pfad unabhängig vom Betriebssystem absolut ist?

Unter Linux:

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

Unter Windows:

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

kann ich wahrscheinlich Code etwas zu bekommen, um mit diesem, aber ich wollte nur herausfinden, ob jemand eine eingebaute Klasse in Java kannte, um dieses Problem zu lösen. Oder hat jemals jemand dieses Problem? Und wie hast du es gelöst?

Danke!

+1

auf Linux, ein Pfad wie "c:/Meine Dokumente" ist wahrscheinlich ungültig, und es ist sicherlich nicht absolut. In Systemen, die den Posix-Standard implementieren, existieren alle Pfade unter einem einzelnen "root", und somit beginnt ein absoluter Pfad bei diesem root. Ein absoluter Pfad beginnt also immer mit "/". alles andere wird als relativ zum aktuellen Arbeitsverzeichnis des Prozesses angesehen. Unter Linux versteht man unter "C:/..." das Verzeichnis innerhalb des aktuellen Arbeitsverzeichnisses mit dem Namen "C:", das höchstwahrscheinlich Unsinn ist. – SingleNegationElimination

+1

Ihre Frage macht wenig Sinn. Stellen Sie sich ein hypothetisches Betriebssystem vor, bei dem alle Pfade absolut sind. Nehmen wir an, es gibt Java auf diesem Betriebssystem. Um Ihre Anforderung zu erfüllen, benötigen Sie daher eine isFileAbsolute() -Methode, die unabhängig von der Plattform, auf der das Programm gerade ausgeführt wird, immer true zurückgibt. Einfach zu implementieren, aber bedeutungslos. –

+0

Ich habe eine Situation, in der Benutzer ein Arbeitsverzeichnis auf einem Remote-Computer konfiguriert. Auf dem Remotecomputer kann Unix oder Windows ausgeführt werden (obwohl das am häufigsten vorkommende Szenario der lokale Computer ist Windows und der Remotecomputer Unix). Der benutzerspezifische Pfad muss validiert werden, und es muss bestimmt werden, ob ein Pfad absolut ist. –

Antwort

10

Nein.

Es gibt einige zugrunde liegenden FileSystem Klassen (das ist Java 7, aber sie existieren, bevor es auch), die isAbsolute() aussetzen, aber sie sind nicht öffentlich - damit Sie sollten sie nicht benutzen, und selbst wenn Du hättest deinen Code voller Reflektions-Junks - und nur die "richtigen" OS-Dateien sind in der JRE enthalten, also musst du sie sowieso codieren.

Hier sind die Java 7-Implementierungen von isAbsolute (...), um loszulegen. Beachten Sie, dass File.getPrefixLength() package-private ist.

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

Beachten Sie, dass diese Antwort nach sechs Jahren veraltet ist. Heutzutage enthält die File-Klasse eine "[isAbsolute()] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute)" -Methode, die genau das tut, was Sie 'tun d expect: _ "Prüft, ob dieser abstrakte Pfadname absolut ist. Die Definition des absoluten Pfadnamens ist systemabhängig. Auf UNIX-Systemen ist ein Pfadname absolut, wenn sein Präfix"/"ist. Auf Microsoft Windows-Systemen ist ein Pfadname absolut, wenn sein Präfix ist ein Laufwerksspezifizierer gefolgt von "\\", oder wenn sein Präfix ist "\\\\" _ – Guus

-1

ich diese am Ende mit (in Java 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

Sie kopiert Java 7 Implementierung öffentlichen boolean isAbsolute (Datei f) für Windows, aber Sie verwenden Apache Commons FilenameUtils.getPrefixLength() -Methode Java 7-Implementierung und Apache-Implementierung von getPrefixLength() sind nicht identisch.Für UNC-Pfade wird Apache "\\ foo \ poo" -> "\\ foo \" als Präfix und Länge wird 6 – acheron55

+0

@ Acheron55: Ich don Verstehst du nicht "isAbsolute()", auf das du dich beziehst? Wo ist es genau in meinem Quellschnipsel? – stuhpa

+0

check t Der Quellcode von FilenameUtils.getPrefixLength (Pfad). Es kann eine beliebige Länge für UNC-Pfade zurückgeben. Sie überprüfen jedoch nur die Länge 2 oder 3 in Ihrer testPathWin-Methode. Also ist es falsch. Es wäre wahr, wenn Sie Java-Implementierung davon verwenden könnten. Weil es nur 0,1,2,3 Werte zurückgibt. Auch diese Zeile: 'if (testPathWin (Pfad, PräfixLänge) || TestPfadLinux (PräfixLen))' Linux-Check wird Ihre Windows-Methode nutzlos machen, da es einen viel breiteren Bereich hat. Nehmen wir an, Ihre Länge ist 1 für einen Windows-Pfad, aber Ihre testPath-Methode gibt immer noch true zurück, was false ist – acheron55

3

Mein Riss an diesem mit Apache FilenameUtil -

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

Technisch ist dies relativ! Was für meine Zwecke in Ordnung ist.

8

In Java 7:

new File(path).isAbsolute()