2016-08-24 5 views
0

Есть предыдущие вопросы о проверке соответствия файла шаблону glob (here is one). Однако я хотел бы получить список файлов, соответствующих шаблону glob, без указания базового каталога для поиска. Мне нужно принять как относительные, так и абсолютные каталоги (я разрешаю относительные к указанному каталогу), и он должен быть кросс-платформенным.получить список файлов из glob без указания базового каталога

Учитывая строку, например, "C:/Users/Foo/", "/ пользователь/Foo/ .txt" или "реж/* .txt.", Как я могу получить список соответствующих путей?

+0

Почему вы не хотите, чтобы указать базовый каталог? Легко сделать те, у которых есть абсолютный путь, и вам нужно обрабатывать их с относительным путем. Вы также можете предоставить базовый каталог для них. – Guenther

+0

Но если путь '../../*. Txt', то он не будет внутри базового каталога, из которого я разрешаю, и я не могу разрешить его с помощью Path.resolve, потому что' * 'не является символом юридического пути и генерирует исключение. Кроме того, если это абсолютный путь, то какой базовый каталог я должен указывать? На этот вопрос никогда не отвечали [здесь] (http://stackoverflow.com/questions/25682140/resolve-absolute-paths-with-wildcards-in-java-6). –

+0

Кроме того, мне нужен программный способ спросить, является ли шаблон glob относительным в первую очередь. –

ответ

0

Да, вам понадобится программный способ узнать, является ли шаблон глобуса абсолютным. Это может быть сделано следующим образом:

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

В Windows это будет выводить

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

В UNIX последний является абсолютным. Если вы знаете, что шаблон glob относительный, добавьте к нему специальный каталог. После этого у вас будет абсолютный путь для всех шаблонов glob и может использовать его для указания его для поиска.

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

отпечатывается

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

вам все равно придется сделать подстановку самостоятельно или использовать любые методы, описанные в посте вы упомянули (How to find files that match a wildcard string in Java?)

+0

У java.io есть способ разрешить относительные пути с произвольными базовыми каталогами? Это там в nio ... –

+0

Не совсем уверен, что вы просите. Если у вас несколько базовых каталогов, вы можете сделать цикл и добавить каждый базовый каталог в относительный шаблон glob. – Guenther

+0

Я не имею в виду несколько базовых каталогов. Я имею в виду, что я могу сделать 'Path.get ('/ user/foo'). Resolve ('../ relative/dir/file.txt')'. С java.io кажется, что относительные пути разрешены относительно текущего рабочего каталога. –

Смежные вопросы