Question

En tant que suivi au dossier à à l'aide TrueZip .zip? comment peut-on copier le contenu d'un fichier compressé dans un autre en utilisant TrueZip? Quand j'invoque:

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

J'obtenir:

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 chose est, je sais pertinemment que c:/foo.zip est un fichier existant, pas un répertoire.

  1. Pourquoi ai-je cette erreur?
  2. Comment suis-je censé convertir un fichier ZIP dans un fichier JAR en utilisant TPaths?
  3. Est-ce que TPath nécessite démontant comme TFile fait?
Était-ce utile?

La solution

Répondre à ma question ... S'il vous plaît noter que je compris cela par essais et erreurs pour que je puisse me tromper sur certains points:

  1. Archives sont traités comme des répertoires. Files.copy(archive, archive) est essentiellement tente de copier un répertoire à un autre. Files.copy(Path, Path) est fait pour la copie d'un fichier unique, pas pour copier les répertoires récursivement.

  2. Maintenant que nous savons archives sont traités comme des répertoires nous suffit de copier les fichiers d'un répertoire dans un autre:

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. Oui, vous pouvez utiliser: targetFile.getFileSystem().sync(FsSyncOptions.UMOUNT);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top