Как копировать файлы, используя Truezip TPATH?
Вопрос
Как продолжение Преобразовать файл .tar.gz в .zip с помощью truezip? Как один скопирует содержимое одного сжатого файла в другой, используя Trutzip? Когда я призываю:
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
существующий файл, а не каталог.
- Почему я получаю эту ошибку?
- Как я должен преобразовать файл Zip в файл JAR с помощью TPATHS?
- Требуется ли TPATH, как Tfile?
Решение
Отвечая на мой собственный вопрос ... Обратите внимание, что я выяснил это по пробным и ошибкам, чтобы я мог ошибаться в некоторых моментах:
Архивы рассматриваются как каталоги.
Files.copy(archive, archive)
По сути, пытается скопировать один каталог в другой.Files.copy(Path, Path)
создан для копирования одного файла, а не для рекурсивного копирования каталогов.Теперь, когда мы знаем, что архивы рассматриваются как каталоги, которые мы просто копируем файлы из одного каталога в другой:
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);