TarWriter utilizza le voci HardLink per i file con collegamenti fisici.

TarWriter ora rileva quando più file sono collegati mediante hard link allo stesso inode. Scrive una HardLink voce per i file successivi invece di duplicare il contenuto del file.

Versione introdotta

.NET 11 Preview 3

Comportamento precedente

In precedenza, durante la creazione di un archivio tar con TarWriter, i file hard-linked allo stesso inode venivano considerati come file separati e indipendenti. Il contenuto completo del file è stato duplicato nell'archivio per ogni hard link.

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

Nell'oggetto risultante archive.tar, entrambi file1.txt e file2.txt avevano voci di file separate, ognuna contenente il contenuto completo del file.

Nuovo comportamento

A partire da .NET 11, TarWriter rileva quando più file sono collegati allo stesso inode e scrive una voce di HardLink per i file successivi anziché duplicare il contenuto del file.

Usando lo stesso codice illustrato nella sezione Comportamento precedente , il risultato archive.tar contiene ora una voce di file completa per file1.txt, mentre file2.txt ha una HardLink voce di ingresso che punta a file1.txt.

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Questa modifica migliora l'efficienza degli archivi tar creati dalla System.Formats.Tar libreria. Utilizzando <le voci System.Formats.Tar.TarEntryType.HardLink> per i file che condividono lo stesso inode, le dimensioni dell'archivio risultante vengono ridotte e le relazioni di collegamento rigido tra i file vengono mantenute. Questo comportamento è coerente con GNU tar e altre implementazioni tar ampiamente usate.

Se l'applicazione dipende dalla duplicazione del contenuto dei file con collegamenti fisici, è possibile ripristinare il comportamento precedente. Impostare la HardLinkMode proprietà su TarHardLinkMode.CopyContents in una nuova TarWriterOptions istanza:

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

L'estrazione di un archivio tar contenente HardLink voci in un file system che non supporta gli hard link genera un'eccezione IOException. Usare la nuova TarExtractOptions classe per specificare se estrarre i collegamenti rigidi come collegamenti rigidi o copiarli come file separati. Ciò consente l'estrazione nei file system senza supporto di collegamento rigido.

Le API interessate