2016-03-20 5 views
1

私は、Linux/Unixで正常に動作し、次のコードがあります。Files.walk()OS非依存の問題

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); 

ただし、Windowsの下で、この部分は正常に動作しないようですが:

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

このOSに依存しないようにする適切な方法は何ですか?

+0

これはテストできませんので、コメントを使用します: '/'の代わりにFile.separatorを使用してください。 ( "。*" + File.separator + "\\ .. *") –

+0

私はすでに試してみましたが、エスケープする必要があるため動作しません。とにかくありがとう! – carlspring

答えて

3

Pathとハードコードされたファイル区切り文字を一致させないでください。これは問題を引き起こす可能性があります。

ディレクトリの名前を取得し、ドットで始まる場合はスキップします。

Pathオブジェクトとして、このパスが示すファイルまたはディレクトリの名前を返し

:あなたはgetFileName()とディレクトリの名前を取得することができます。ファイル名は、で、ディレクトリ階層のルートから最も遠い要素です。

次に、startsWith(".")を使用してドットで始まるかどうかを確認できます。このように

、あなたが

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

あなたは正しいです、私のためにそれを簡素化してくれてありがとう! :) – carlspring

2

を持つことができ@Tunakiが示唆するものに対する別の解決策は、OS固有のファイル区切りでスラッシュを交換しようとすることです(それがある場合には、あなたはそれをエスケープする必要があります。 Windowsのバックスラッシュ文字):

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

ありがとうございました! :) – carlspring