TarWriter gebruikt HardLink-vermeldingen voor hard-linked bestanden

TarWriter detecteert nu wanneer meerdere bestanden zijn gekoppeld aan dezelfde inode. Het schrijft een HardLink vermelding voor volgende bestanden in plaats van de bestandsinhoud te dupliceren.

Geïntroduceerde versie

.NET 11 preview 3

Vorig gedrag

Voorheen werden bij het maken van een tar-archief met TarWriter bestanden die hard-links hadden naar dezelfde inode, behandeld als afzonderlijke, onafhankelijke bestanden. De volledige bestandsinhoud is gedupliceerd in het archief voor elk vast gekoppeld bestand.

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");
}

In het resulterende archive.tar, beschikten zowel file1.txt als file2.txt over afzonderlijke bestandsregistraties, waarbij elk de volledige bestandsinhoud bevatte.

Nieuw gedrag

Vanaf .NET 11 detecteert TarWriter wanneer meerdere bestanden zijn gekoppeld aan dezelfde inode en schrijft een HardLink vermelding voor volgende bestanden in plaats van de bestandsinhoud te dupliceren.

Als u dezelfde code gebruikt als in de sectie Vorige gedrag , bevat het resulterende archive.tar bestand nu een volledige bestandsvermelding voor file1.txt, terwijl file2.txt er een HardLink vermelding naar file1.txtverwijst.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging verbetert de efficiëntie van tar-archieven die door de System.Formats.Tar bibliotheek zijn gemaakt. Door System.Formats.Tar.TarEntryType.HardLink-vermeldingen< te gebruiken >voor bestanden die dezelfde inode delen, wordt de grootte van het resulterende archief verkleind en blijven de relaties tussen bestanden met vaste koppelingen behouden. Dit gedrag is consistent met GNU tar en andere veelgebruikte tar-implementaties.

Als uw toepassing afhankelijk is van het dupliceren van bestandsinhoud voor vaste bestanden, kunt u het vorige gedrag herstellen. Stel de HardLinkMode eigenschap in op TarHardLinkMode.CopyContents in een nieuw TarWriterOptions exemplaar.

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");
}

Het extraheren van een tar-archief dat vermeldingen bevat HardLink in een bestandssysteem zonder harde koppelingsondersteuning genereert een IOException. Gebruik de nieuwe TarExtractOptions klasse om op te geven of harde koppelingen moeten worden geëxtraheerd als vaste koppelingen of als afzonderlijke bestanden moeten worden gekopieerd. Dit maakt extractie naar bestandssystemen mogelijk zonder ondersteuning voor vaste koppelingen.

Betreffende API's