Как использовать перетаскивание каталогов в JDK7
Я пытаюсь использовать новую функцию globbing в JDK7, начиная с документации и примеров
Я могу получить глобусы, такие как "glob:*.dat"
для работы с
Files.walkFileTree(startingDir, finder);
но мне не удалось получить синтаксис "**"
. Я хотел бы иметь возможность создать что-то вроде:
matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat");
и был бы благодарен за простой пример. Я использую Windows 7.
UPDATE:
@Oleg и @JBNizet дают понять, что синтаксис "/" не зависит от ОС. Обратите внимание, что Javadocs позволяют предположить, что синтаксис, зависящий от ОС, также возможен (требуется)
ВСЕ ПРОБЛЕМЫ:
Приняли @Nizet и отредактировали следующим образом:
@Test
public void testStackoverflowGlobber() throws IOException {
final PathMatcher matcher =
FileSystems.getDefault().getPathMatcher("glob:*.cml");
Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("try>> "+file);
if (matcher.matches(file)) {
System.out.println("MATCHES>>"+file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
и это дает результат, например:
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdx
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cif\aa2004.cml
но никаких доказательств соответствия
Ответы
Ответ 1
Вот рабочий пример, который отображает все zip файлы в любом каталоге-потомке d:/
:
public static void main(String[] args) throws IOException {
final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip");
Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (matcher.matches(file)) {
System.out.println(file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
Как вы видите, использование косой черты работает в Windows.
Ответ 2
Вам нужно запустить свой глобус с помощью **
matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat");
В противном случае вызов
matcher.matches(file)
пытается сопоставить полный путь к файлу с регулярным выражением, которое начинается с относительного пути (/foo/), а не с абсолютным путем (d:/petermr-workspace/.../foo).
Превращение ** в glob просто указывает ему игнорировать начало абсолютного пути.