0

NIO2 を使用して、ソース ディレクトリの内容から zip ファイルを作成しています。最初にインスタンスを取得してからパスを生成する必要があるZipFileSystemを使用しています。Files.createDirectory(pathInZip)生成されたパスを使用して、またはを使用して zip ファイルにエントリを作成できますFiles.copy(sourcePath, destPathInZip)。これは問題なく動作しますが、回避したい醜い瞬間があります。

 // within the SimpleFileVisitor that walks through sourceDirFile
 @Override
 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    Path pathInZip = zipFileSystem.getPath(sourceDirPath.relativize(file).toString()); // <-- ?!
    Files.copy(file, pathInZip);
    return FileVisitResult.CONTINUE;
 }

依存せずに、ある FileSystemProvider から別のパスにパスをコピーする方法はありますaPath.toString()か?. 醜いようです。私はいつでも 1 つのパスを繰り返し、もう 1 つのパスをインクリメンタルに構築することができました。

4

2 に答える 2

1

このためのユーティリティメソッドをいくつか書きました。役に立つかもしれません (ライブラリはオープン ソースです)。

チュートリアル: http://softsmithy.sourceforge.net/lib/current/docs/tutorial/nio-file/index.html

Javadoc: http://softsmithy.sourceforge.net/lib/current/docs/api/softsmithy-lib-core/index.html

メイヴン:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>softsmithy-lib-core</artifactId>  
    <version>0.2</version>   
</dependency> 

詳細: http://puces-blog.blogspot.ch/2012/07/news-from-software-smithy-version-02.html

于 2012-10-12T10:43:29.983 に答える
1

私は以下のdirutils libを使用しており、あなたがやろうとしていることをしていると思います。toPath.resolve() を使用します

https://github.com/bbejeck/Java-7/blob/master/src/main/java/bbejeck/nio/files/visitor/CopyDirVisitor.java

編集:lolあなたが言ったので、私は自分のコードを再訪し、libのその部分だけにパッチを当てたことに気付きました. 人は物事をとても簡単に忘れてしまう..

 @Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

    Path relativizedPath =fromPath.relativize(dir);

    Path targetPath = toPath.resolve(relativizedPath.toString());
    if(!Files.exists(targetPath)){
        Files.createDirectory(targetPath);
    }
    return FileVisitResult.CONTINUE;
}
于 2012-10-04T06:47:03.090 に答える