TarWriter verwendet HardLink-Einträge für hart verknüpfte Dateien

TarWriter erkennt jetzt, wenn mehrere Dateien hart mit derselben Inode verknüpft sind. Er schreibt einen HardLink Eintrag für nachfolgende Dateien, anstatt den Dateiinhalt zu duplizieren.

Eingeführt in Version

.NET 11 Vorschau 3

Bisheriges Verhalten

Beim Erstellen eines Tar-Archivs mit TarWriter wurden Dateien, die mit derselben Inode hart verknüpft waren, als separate, unabhängige Dateien behandelt. Der vollständige Dateiinhalt wurde im Archiv für jede durch einen festen Link verknüpfte Datei dupliziert.

using System.Formats.Tar;
using System.IO;

string filePath1 = "file1.txt";
string filePath2 = "file2.txt";

// Create two hard-linked files.
File.WriteAllText(filePath1, "Hello, world!");
File.CreateHardLink(filePath2, filePath1);

using (var stream = File.Create("archive.tar"))
using (var writer = new TarWriter(stream, TarEntryFormat.Pax, leaveOpen: false))
{
    writer.WriteEntry(filePath1, "file1.txt");
    writer.WriteEntry(filePath2, "file2.txt");
}

Im resultierenden archive.tar hatten sowohl file1.txt als auch file2.txt separate Dateieinträge, die jeweils den vollständigen Dateiinhalt enthielten.

Neues Verhalten

Ab .NET 11 erkennt TarWriter, wenn mehrere Dateien hart mit derselben Inode verknüpft sind, und schreibt einen HardLink Eintrag für nachfolgende Dateien, anstatt den Dateiinhalt zu duplizieren.

Durch die Verwendung desselben Codes wie im Abschnitt Vorheriges Verhalten enthält der resultierende archive.tar nun einen vollständigen Dateieintrag für file1.txt, während file2.txt einen HardLink-Eintrag hat, der auf file1.txt verweist.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Diese Änderung verbessert die Effizienz von Tar-Archiven, die von der System.Formats.Tar Bibliothek erstellt wurden. Durch Die Verwendung von <System.Formats.Tar.TarEntryType.HardLink-Einträgen> für Dateien, die dieselbe Inode verwenden, wird die Größe des resultierenden Archivs reduziert, und die hartverknüpften Beziehungen zwischen Dateien bleiben erhalten. Dieses Verhalten ist mit GNU Tar und anderen weit verbreiteten Tar-Implementierungen konsistent.

Wenn Ihre Anwendung von der Duplizierung von Dateiinhalten für hart verknüpfte Dateien abhängt, können Sie das vorherige Verhalten wiederherstellen. Setzen Sie die HardLinkMode-Eigenschaft für eine neue TarWriterOptions-Instanz auf TarHardLinkMode.CopyContents fest.

using System.Formats.Tar;
using System.IO;

string filePath1 = "file1.txt";
string filePath2 = "file2.txt";

// Create two hard-linked files.
File.WriteAllText(filePath1, "Hello, world!");
File.CreateHardLink(filePath2, filePath1);

var options = new TarWriterOptions
{
    HardLinkMode = TarHardLinkMode.CopyContents
};

using (var stream = File.Create("archive.tar"))
using (var writer = new TarWriter(stream, options, leaveOpen: false))
{
    writer.WriteEntry(filePath1, "file1.txt");
    writer.WriteEntry(filePath2, "file2.txt");
}

Das Extrahieren eines tar-Archivs, das HardLink-Einträge enthält, in ein Dateisystem ohne Unterstützung fester Links löst eine IOException aus. Verwenden Sie die neue TarExtractOptions Klasse, um anzugeben, ob Hardlinks als hardlinks extrahiert oder als separate Dateien kopiert werden sollen. Dies ermöglicht die Extraktion von Dateisystemen ohne Unterstützung für feste Verknüpfungen.

Betroffene APIs