1

作为使用 TrueZip 将 .tar.gz 文件转换为 .zip 的后续行动?如何使用 TrueZip 将一个压缩文件的内容复制到另一个压缩文件中?当我调用时:

TPath sourceFile = new TPath("c:/foo.zip");
TPath targetFile = new TPath("c:/bar.jar");
Files.copy(sourceFile, targetFile, StandardCopyOption.COPY_ATTRIBUTES);

我得到:

java.io.FileNotFoundException: C:\foo.zip (expected FILE - is DIRECTORY)
    at de.schlichtherle.truezip.nio.file.TFileSystemProvider.copy(TFileSystemProvider.java:397)
    at de.schlichtherle.truezip.nio.file.TFileSystemProvider.copy(TFileSystemProvider.java:364)
    at java.nio.file.Files.copy(Files.java:1219)

问题是,我知道这c:/foo.zip是一个现有文件,而不是目录。

  1. 为什么我会收到此错误?
  2. 我应该如何使用 TPaths 将 ZIP 文件转换为 JAR 文件?
  3. TPath 是否需要像 TFile 那样卸载?
4

1 回答 1

2

回答我自己的问题...请注意,我通过反复试验发现了这一点,因此在某些方面我可能是错误的:

  1. 档案被视为目录。Files.copy(archive, archive)本质上是试图将一个目录复制到另一个目录。Files.copy(Path, Path)用于复制单个文件,而不是用于递归复制目录。

  2. 现在我们知道档案被视为目录,我们只需将文件从一个目录复制到另一个目录:

Files.walkFileTree(sourceFile, new SimpleFileVisitor<Path>()
{
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
    {
        Files.copy(file, targetFile.resolve(sourceFile.relativize(file)), 
            StandardCopyOption.COPY_ATTRIBUTES);
        return super.visitFile(file, attrs);
    }
});

3. 是的,您可以使用:targetFile.getFileSystem().sync(FsSyncOptions.UMOUNT);

于 2012-02-18T03:42:53.323 回答