Как скопировать файлы, используя TrueZip TPath? - PullRequest
1 голос
/ 18 февраля 2012

В качестве продолжения Преобразование файла .tar.gz в .zip с использованием TrueZip? Как копировать содержимое одного сжатого файла в другой, используя 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. Как мне преобразовать ZIP-файл в файл JAR с помощью TPaths?
  3. Требуется ли размонтировать TPath, как это делает TFile?

1 Ответ

2 голосов
/ 18 февраля 2012

Отвечая на мой собственный вопрос ... Обратите внимание, что я понял это методом проб и ошибок, поэтому я могу ошибаться в некоторых моментах:

  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);

...