Найти файлы во внутреннем zipfile Commons VFS

Можно ли использовать метод FileObject::findFiles или аналогичный для поиска в ZIP-файлах, которые хранятся в папке? Или я должен открыть zip-файлы самостоятельно?

FileObject root = vfs.resolveFile(file:///home/me/test/vfsdir);
// shows everything except the content of the zip 
FileObject[] allFiles = root.findFiles(Selectors.SELECT_ALL);    
// should contain only the three xmls
FileObject[] xmlFiles = root.findFiles(xmlSelector);

Дерево каталогов VFS

/ (root)
/folderwithzips
/folderwithzips/myzip.zip (Zipfile not a folder)
/folderwithzips/myzip.zip/myfile.xml
/folderwithzips/myzip.zip/myfile2.xml
/folderwithzips/other.zip 
/folderwithzips/other.zip/another.xml

1 ответ

Решение

К сожалению, невозможно выполнить поиск по содержимому zips в VFS, как если бы они были папками.

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

Этот небольшой метод помогает мне.

public static void main(String[] vargs) throws FileSystemException {
    FileSystemManager manager = VFS.getManager();
    FileObject root = manager.resolveFile("/home/me/test/vfsdir");

    List<FileObject> files = findFiles(root, new XMLSelector());
    files.stream().forEach(System.out::println);
}

public static List<FileObject> findFiles(FileObject root,FileSelector fileSelector) throws FileSystemException {
    List<FileObject> filesInDir = Arrays.asList(root.findFiles(fileSelector));
    FileObject[] zipFiles = root.findFiles(new ZipSelector());

    FileSystemManager manager = VFS.getManager();

    List<FileObject> filesInZips = new ArrayList<>();
    for (FileObject zip: zipFiles){
        FileObject zipRoot = manager.createFileSystem(zip);
        Stream.of(zipRoot.findFiles(fileSelector)).forEach(filesInZips::add);
    }

    return Stream.concat(filesInDir.stream(),filesInZips.stream()).collect(Collectors.toList());
}
Другие вопросы по тегам