2016-08-24 13 views
0

ファイルがグロブパターン(here is one)と一致するかどうかを確認するためのこれまでの質問があります。しかし、検索するベースディレクトリを指定することなく、グロブパターンに一致するファイルのリストを取得したいと思います。私は相対ディレクトリと絶対ディレクトリの両方を受け入れる必要があります(私は相対ディレクトリを指定されたディレクトリに解決します)。また、プラットフォーム間の互換性が必要です。ベースディレクトリを指定せずにグロブからファイルリストを取得

"C:/ users/foo/"、 "/ user/foo/ .txt"または "dir/*。txt"などの文字列を指定すると、一致するパスのリストはどのように取得できますか?

+0

に記載のいずれかの方法を使用する必要があります

c:\BaseDir\..\path\*.txt: is absolute c:\..\path\*.txt: is absolute c:\BaseDir\..\path\*.txt: is absolute 

を印刷しますベースディレクトリ?絶対パスを持つものを実行するのは簡単ですし、とにかく相対パスでそれらを処理する必要があります。また、それらのためのベースディレクトリを提供することもできます。 – Guenther

+0

しかし、もしパスが '../../*。txt'なら、それは私が解決しているベースディレクトリの中には存在しません。そして、Path.resolveを使って解決できません。' * 'は正当なパス文字ではなく、例外をスローします。また、絶対パスであれば、どのベースディレクトリを指定する必要がありますか?この質問は決して答えられなかった[ここ](http://stackoverflow.com/questions/25682140/resolve-absolute-paths-with-wildcards-in-java-6)。 –

+0

それの上に、globパターンが最初に相対的であるかどうかを尋ねるプログラム的な方法が必要です。 –

答えて

0

はい、グロブパターンが絶対的であるかどうかを調べるには、プログラム的な方法が必要です。これは以下のように行うことができます。Windows上で

for (String glob : new String[] { "../path/*.txt", "c:/../path/*.txt", "/../path/*.txt" }) { 
     System.out.println(glob + ": is " + (new File(glob).isAbsolute() ? "absolute" : "relative")); 
    } 

この意志出力

../path/*.txt: is relative 
c:/../path/*.txt: is absolute 
/../path/*.txt: is relative 

UNIX上の最後には、絶対的です。グロブパターンが相対的であることが分かっている場合は、それに特別なディレクトリを追加します。その後、すべてのグロブパターンの絶対パスを取得し、それを使用して検索用に指定することができます。

EDIT 1 あなたがコメントしたとおり、次のことができます。しかし、nioとioを混在させて一致させることもできます。 java.io.File.isAbsolute()は、絶対パスまたは相対パスかどうかを判断するために、ファイルが実際に存在する場合ではなく、ファイルパスのFORMATをチェックするだけです。それはプラットフォーム特有の荘園でそれを行います。

String baseDir = "c:/BaseDir/"; 
    for (String glob : new String[] { "../path/*.txt", "c:/../path/*.txt", "/../path/*.txt" }) { 
     File file = new File(glob); 
     if (!file.isAbsolute()) { 
      file = new File(baseDir, glob); 
     } 
     System.out.println(file.getPath() + ": is " + (file.isAbsolute() ? "absolute" : "relative")); 
    } 

これはなぜあなたが指定したくないあなたはまだ自分をグロブ行うか、あなたが言及したポスト(How to find files that match a wildcard string in Java?

+0

java.ioは任意のベースディレクトリとの相対パスを解決する方法がありますか?それはニオイにあります... –

+0

あなたは何を求めているのですか?複数のベースディレクトリがある場合は、ループを実行して、各基本ディレクトリの先頭に相対グロブパターンを付けることができます。 – Guenther

+0

私は複数のベースディレクトリを意味しません。私は 'Path.get( '/ user/foo')。resolve( '../ relative/dir/file.txt')'を実行できることを意味します。 java.ioでは、現在の作業ディレクトリに対して相対パスが解決されているようです。 –