2012-02-18 5 views
1

В качестве дополнения к Convert .tar.gz file to .zip using TrueZip? как копировать содержимое одного сжатого файла в другой с помощью TrueZip? Когда я призываю:Как скопировать файлы с помощью TrueZip TPath?

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?

ответ

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

Смежные вопросы