2017-02-12 1 views
1

hinzuzufügen Ich habe eine Reihe von Dateien, in denen einige harte Links auf einige der Dateien zeigen. Beispiel:Apache Commons Compress nicht in der Lage, harte Link in Teer

/tmp/test/file1 
/tmp/test/file1_Link 

Die file1 ist eine Datei mit einer Größe von 1 MB. file1_Link ein harter Link zu file1 zeigt

Wenn ich den Unix tar Befehl verwenden, um diese beiden Dateien auf Teer, hat das resultierende Archiv mit einer Größe von 1 MB (mytar.tar)

tar -cvf ../mytar.tar . 
-rw-r--r-- 1 bsarraf 189060905 1.0M Feb 11 22:06 mytar.tar 
-rw-r--r-- 1 bsarraf 189060905 2.0M Feb 11 22:10 files.tar 

Allerdings, wenn ich die Verwendung Apache Commons komprimieren und fügen Sie alle Dateien in der TAR-Datei, ich bekomme ein Teer mit der Größe 2 MB (files.tar).

Dies bedeutet im tar die gleiche Datei wurde zweimal hinzugefügt.

Wie kann ich die Hard-Link-Datei im Teer als fester Link der anderen Datei hinzufügen?

+0

Sie haben Ihren Code nicht angezeigt. Ich glaube, Sie müssen harte Links erkennen und die Erstellung des Link-Eintrags (innerhalb der TAR-Datei) selbst vornehmen. 'org.apache.commons.compress.archivers.tar.TarConstants' enthält Typkonstanten sowohl für weiche (' LF_SYMLINK') als auch für harte ('LF_LINK') Links. –

+0

Danke @JimGarrison für Ihre Antwort. Ich konnte das Problem mit einem Experiment lösen. –

Antwort

1

Für andere, die möglicherweise das gleiche Problem haben, konnte ich das Problem mit dem folgenden Ansatz lösen: 1. Identifizieren Sie, ob die Datei eine feste Verbindung ist, gibt es verschiedene Möglichkeiten, dies zu tun. 2. Sobald harte Links identifiziert werden, verwenden Sie die folgende Methode, um die kompromisslose Datei in der TAR-Datei

private void addLinkFileToTar(TarArchiveOutputStream tar, File linkFile, File file, String base) 
     throws IOException { 
    String entryName = base + linkFile.getName(); 
    TarArchiveEntry tarEntry = new TarArchiveEntry(entryName, TarConstants.LF_LINK); 
    tarEntry.setLinkName(base+file.getName()); 
    tar.putArchiveEntry(tarEntry); 
    tar.closeArchiveEntry(); 
} 

hier Linkdatei ist die harte Verknüpfungsdatei und Datei ist das Ziel hinzuzufügen.