Pregunta

Como seguimiento a ¿Convertir un archivo .tar.gz a .zip usando TrueZip? ¿Cómo se copia el contenido de un archivo comprimido en otro usando TrueZip?Cuando invoco:

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

Yo obtengo:

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)

La cuestión es que sé con certeza que c:/foo.zip es un archivo existente, no un directorio.

  1. ¿Por qué recibo este error?
  2. ¿Cómo se supone que debo convertir un archivo ZIP a un archivo JAR usando TPaths?
  3. ¿TPath requiere desmontarse como lo hace TFile?
¿Fue útil?

Solución

Respondiendo a mi propia pregunta ... Tenga en cuenta que descubrí esto por prueba y error para que pudiera estar equivocado en algunos de los puntos:

  1. Los archivos son tratados como directorios. Files.copy(archive, archive) esencialmente está tratando de copiar un directorio a otro. Files.copy(Path, Path) está hecho para copiar un solo archivo, no para copiar directorios recursivamente.

  2. Ahora que sabemos que los archivos son tratados como directorios, simplemente copiamos archivos de un directorio a otro:

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. Sí, puedes usar: targetFile.getFileSystem().sync(FsSyncOptions.UMOUNT);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top