2017-05-30 11 views
0

FileObject :: findFilesメソッドなどを使用して、フォルダに保存されているZIPファイルを検索することはできますか?あるいは、自分でzipファイルを開く必要がありますか?内部zipファイル内のファイルを見つけるCommons VFS

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 
+0

7zipバインディング(net.sf.sevenzipjbinding:sevenzipjbinding)を使用してFileSystemProviderを実装しました。その結果、PathsおよびFilesクラスのすべてのメソッドが、サポートされているすべてのアーカイブで動作するようになりました。 – corsair

答えて

0

悲しいことに、それは彼らがフォルダであるかのように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()); 
} 
関連する問題