Как найти файлы, которые соответствуют подстановочной строке в Java?

Из-за некоторых дополнительных затруднений с синтаксисом Python я обнаружил, что это работает:

ProjectionExpression=attr1+","+attr2

ProjectionExpression = 'attr, attr2' не оценивался правильно, поэтому я получил KeyError, когда попытался создать ответ, как:

'body': response['Items'][0][attr1]+"|"+response['Items'][0][attr2]

Надеюсь, что это спасет некоторых других новичков Python некоторые колебания.

143
задан Jason S 27 April 2009 в 21:03
поделиться

6 ответов

Рассмотрим DirectoryScanner из Apache Ant:

DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes(new String[]{"**/*.java"});
scanner.setBasedir("C:/Temp");
scanner.setCaseSensitive(false);
scanner.scan();
String[] files = scanner.getIncludedFiles();

Вам понадобится ссылка на ant.jar (~ 1,3 МБ для муравья 1.7.1).

74
ответ дан 23 November 2019 в 22:57
поделиться

Почему бы не использовать, сделайте что-то вроде:

File myRelativeDir = new File("../../foo");
String fullPath = myRelativeDir.getCanonicalPath();
Sting wildCard = fullPath + File.separator + "*.txt";

// now you have a fully qualified path

Тогда вам не нужно будет беспокоиться об относительных путях, и вы сможете использовать подстановочные знаки по мере необходимости.

0
ответ дан 23 November 2019 в 22:57
поделиться

. Apache фильтр построен для итерации файлов в известном каталоге. Чтобы разрешить использование подстановочных знаков в каталоге, необходимо разделить путь на « \ » или « / ».

3
ответ дан 23 November 2019 в 22:57
поделиться

Возможно, вам сейчас не поможет, но JDK 7 предназначен для сопоставления имен файлов глобальных и регулярных выражений как часть «Больше возможностей NIO».

18
ответ дан 23 November 2019 в 22:57
поделиться

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

String original = "../Test?/sample*.txt";
String regex = original.replace("?", ".?").replace("*", ".*?");

Это работает для ваших примеров:

Assert.assertTrue("../Test1/sample22b.txt".matches(regex));
Assert.assertTrue("../Test4/sample-spiffy.txt".matches(regex));

И контрпримеры:

Assert.assertTrue(!"../Test3/sample2.blah".matches(regex));
Assert.assertTrue(!"../Test44/sample2.txt".matches(regex));
28
ответ дан 23 November 2019 в 22:57
поделиться

Попробуйте FileUtils из Apache commons-io ( listFiles и iterateFiles методами):

File dir = new File(".");
FileFilter fileFilter = new WildcardFileFilter("sample*.java");
File[] files = dir.listFiles(fileFilter);
for (int i = 0; i < files.length; i++) {
   System.out.println(files[i]);
}

] Чтобы решить вашу проблему с папками TestX , я сначала перебрал бы список папок:

File[] dirs = new File(".").listFiles(new WildcardFileFilter("Test*.java");
for (int i=0; i<dirs.length; i++) {
   File dir = dirs[i];
   if (dir.isDirectory()) {
       File[] files = dir.listFiles(new WildcardFileFilter("sample*.java"));
   }
}

Довольно «грубое решение», но оно должно работать нормально. Если это не соответствует вашим потребностям, вы всегда можете использовать RegexFileFilter .

116
ответ дан 23 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: