2016-04-11 6 views
4

Warum sollte das sein?Path.startsWith gibt false für einen Windows-Dateipfad unter Linux zurück

Path parent1 = Paths.get("/flugel/borf/noggin"); 
Path child1 = Paths.get("/flugel/borf/noggin/foo/bar/baz.jpg"); 
System.out.println("child1 startsWith parent1? " + child1.startsWith(parent1)); 
System.out.println(child1.getFileSystem()); 
System.out.println(parent1.getFileSystem()); 

Path parent2 = Paths.get("C:\\foo"); 
Path child2 = Paths.get("C:\\foo\\bar\\baz.jpg"); 
System.out.println("child2 startsWith parent2? " + child2.startsWith(parent2)); 
System.out.println(child2.getFileSystem()); 
System.out.println(parent2.getFileSystem()); 

kehrt

child1 startsWith parent1? true 
[email protected] 
[email protected] 
child2 startsWith parent2? false 
[email protected] 
[email protected] 

Ich bin Java 8 auf Ubuntu läuft, aber nichts über die javadocs für Path.startsWith erklärt, warum dies geschieht. Kein Dateipfad enthält tatsächliche Dateien.

Antwort

1

Sie müssen den Code überprüfen, um zu sehen, was tatsächlich vor sich geht. Wenn Sie also einen Pfad erstellen, wird normalizeAndCheck aufgerufen. In Ihrem Fall wird dies unter sun.nio.fs.UnixPath aufgerufen. Da der Pfadbegrenzer für * nix / ist, werden die Pfadzeichenfolgen durch / normalisiert.

Bei Windows-Pfaden gibt es keine / so bleiben sie genau das gleiche, so wird es "C:\\foo""C:\\foo\\bar\\baz.jpg" vergleichen, die verschiedenen Saiten sind und somit kein gemeinsamer Präfix.

+0

Ich dachte mir, dass so etwas passiert, aber es fühlt sich immer noch irgendwie überraschend an. – ben3000

+0

Danke für den Link zum entsprechenden Quellcode, ich habe versucht, den falschen Abschnitt zu überspringen, und habe dies daher nicht bemerkt. Gute Antwort. – ben3000

+0

Großartig! Stimme für die Antwort auf :-) – user987339

1

denke ich, unter der Linie von Java Docs von java.nio.file.Path Ihre Frage beantwortet

Ein Objekt, das eine Datei in einem Dateisystem zu finden, verwendet werden. Es wird typischerweise einen systemabhängigen Dateipfad darstellen.

+0

Hmm, muss ich haben, dass etwas Mager lesen, konzentrierte ich mich auf die folgenden Satz: „Wenn der angegebene Pfad mit einem anderen verbunden ist, FileSystem zu diesem Pfad wird dann false zurückgegeben. " Was ich fühlte, bedeutete, dass mein Code gut funktionieren würde. – ben3000

0

Wie in den Javadocs beschrieben, verwendet Java das "Pfadtrennzeichen", um das Pfadtrennzeichen für die aktuelle Betriebsumgebung zu bestimmen.

System.getProperty("path.separator"); 

auf UNIX-basiertes System ist "/", während auf Windows-Systemen ist es "\": Dies kann über zugegriffen werden. Wenn Sie diese Eigenschaften ändern möchten, können Sie die das erreichen folgenden verwenden:

Properties p = System.getProperties(); 
p.put("path.separator", "\\"); 
System.setProperties(p);