¿Cómo copiar archivos usando TrueZip TPath?
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.
- ¿Por qué recibo este error?
- ¿Cómo se supone que debo convertir un archivo ZIP a un archivo JAR usando TPaths?
- ¿TPath requiere desmontarse como lo hace TFile?
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:
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.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);