2016-10-12 3 views
2

Я хочу знать, могу ли я использовать шаблон подстановки в определении пути. Я хочу пойти в одну папку глубже и попытался использовать *, но это не работает.Как использовать подстановочный знак в пути к файлу Java

Я хочу получить файлы, которые находятся в случайных папках. Folderstructure как это:

\test\orig\test_1\randomfoldername\test.zip 
\test\orig\test_2\randomfoldername\test.zip 
\test\orig\test_3\randomfoldername\test.zip 

Что я пробовал:

File input = new File(origin + folderNames.get(i) + "/*/test.zip"); 

File input = new File(origin + folderNames.get(i) + "/.../test.zip"); 

Спасибо заранее!

+1

Что вы имеете в виду 1 папку глубже, вы должны указать в какую папку вы хотите пойти. –

+0

Вы пробовали http://stackoverflow.com/questions/30088245/java-7-nio-list-directory-with-wildcard – kjsebastian

+0

Попробуем и отредактирован для ясности – Warweedy

ответ

0

Я не думаю, что это можно использовать подстановочный знак. Я предлагаю вам использовать способ, как это для вашей задачи:

File orig = new File("\test\orig"); 
    File[] directories = orig.listFiles(new FileFilter() { 
     public boolean accept(File pathname) { 
     return pathname.isDirectory(); 
     } 
    }); 
    ArrayList<File> files = new ArrayList<File>(); 
    for (File directory : directories) { 
     File file = new File(directory, "test.zip"); 
     if (file.exists()) 
      files.add(file); 
    } 
    System.out.println(files.toString()); 
+0

Спасибо, что сделал трюк! – Warweedy

1

Используйте новый Путь, Дорожки, Файлы

Files.find(Paths.get("/test/orig"), 16, 
      (path, attr) -> path.endsWith("data.txt")) 
     .forEach(System.out::println); 

    List<Path> paths = Files.find(Paths.get("/test/orig"), 16, 
      (path, attr) -> path.endsWith("data.txt")) 
     .collect(Collectors.toList()); 

Обратите внимание, что лямбда-выражение с Path path использует Path.endsWith, который соответствует весь таких как test1/test.zip или test.zip.

16 здесь максимальная глубина дерева каталогов для поиска. Существует параметр параметров varargs, например (not), следуя символическим ссылкам в другие каталоги.

Другие условия будут:

path.getFileName().endsWith(".txt") 
path.getFileName().matches(".*-2016.*\\.txt") 
0

Вы можете использовать wildcardard используя PathMatcher:

Вы можете использовать шаблон, как этот для вашего PathMatcher:

/* Find test.zip in any subfolder inside 'origin + folderNames.get(i)' 
* If origin + folderNames.get(i) is \test\orig\test_1 
* The pattern will match: 
* \test\orig\test_1\randomfolder\test.zip  
* But won't match (Use ** instead of * to match these Paths): 
* \test\orig\test_1\randomfolder\anotherRandomFolder\test.zip 
* \test\orig\test_1\test.zip 
*/ 
String pattern = origin + folderNames.get(i) + "/*/test.zip"; 

Есть подробности о синтаксисе этого шаблона в методе FileSysten.getPathMather. Код для создания PathMather может быть:

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); 

Вы можете найти все файлы, которые соответствуют этому шаблону, используя метод Files.find():

Stream<Path> paths = Files.find(basePath, Integer.MAX_VALUE, (path, f)->pathMatcher.matches(path)); 

Метод находки возвращает Stream<Path>. Вы можете выполнить свою операцию над этим потоком или преобразовать его в список.

paths.forEach(...); 

Или:

List<Path> pathsList = paths.collect(Collectors.toList()); 
Смежные вопросы