2016-03-20 22 views
1

Ich habe den folgenden Code, die unter Linux/Unix funktioniert gut:Files.walk() OS-independency Ausgabe

Files.walk(Paths.get(getStartingPath())) 
    .filter(Files::isDirectory) 
    // Skip directories which start with a dot (like, for example: .index) 
    .filter(path -> !path.toAbsolutePath().toString().matches(".*/\\..*")) 
    // Note: Sorting can be expensive: 
    .sorted() 
    .forEach(operation::execute); 

jedoch unter Windows, ist dieser Teil scheint nicht richtig zu funktionieren:

 .filter(path -> !path.toAbsolutePath().toString().matches(".*/\\..*")) 

Was wäre der richtige Weg, um dieses Betriebssystem unabhängig zu machen?

+0

Kann das nicht testen, also werde ich Kommentar verwenden: Anstelle von '/' File.separator verwenden. Übereinstimmungen (". *" + File.separator + "\\ .. *") –

+0

Ich habe das schon versucht, aber es funktioniert nicht, weil es maskiert werden muss. Danke trotzdem! – carlspring

Antwort

3

Sie sollten die Path nicht mit hartcodierten Dateitrennzeichen übereinstimmen. Dies wird zwangsläufig Probleme verursachen.

Was Sie hier wollen, ist eine Möglichkeit, den Namen des Verzeichnisses zu bekommen und es zu überspringen, wenn es mit einem Punkt beginnt. Sie können den Namen des Verzeichnisses mit getFileName() abrufen:

Gibt den Namen der Datei oder des Verzeichnisses, die von diesem Pfad als Path Objekt bezeichnet. Der Dateiname ist das am weitesten entfernte Element aus dem Stammverzeichnis in der Verzeichnishierarchie.

Dann können Sie startsWith(".") verwenden, um zu sehen, ob es mit einem Punkt beginnt oder nicht.

Als solches Sie

.filter(path -> !path.getFileName().startsWith(".")) 
+0

Sie haben Recht, danke, dass Sie es für mich vereinfacht haben! :) – carlspring

2

eine andere Lösung zu dem, was haben könnte @Tunaki ist schlägt vor zu versuchen, den Schrägstrich mit der OS-spezifischen Datei-Separator ersetzt (Sie müssen es im Falle entkommen es das ist Backslash-Zeichen unter Windows):

.filter(path -> 
     !path.toAbsolutePath().toString().matches(".*" 
             + Pattern.quote(File.separator) + "\\..*")) 
+0

Vielen Dank für Ihre Hilfe! :) – carlspring