TarWriter utilise des entrées HardLink pour les fichiers liés en dur

TarWriter détecte maintenant quand plusieurs fichiers sont liés en dur à la même inode. Il écrit une HardLink entrée pour les fichiers suivants au lieu de dupliquer le contenu du fichier.

Version introduite

.NET 11 Preview 3

Comportement antérieur

Auparavant, lors de la création d’une archive tar avec TarWriter, les fichiers qui étaient liés en dur au même inode étaient traités comme des fichiers indépendants distincts. Le contenu complet du fichier a été dupliqué dans l’archive pour chaque fichier lié en dur.

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

Dans le résultat archive.tar, les deux file1.txt et file2.txt avaient des entrées de fichier distinctes, chacune contenant le contenu complet du fichier.

Nouveau comportement

À compter de .NET 11, TarWriter détecte quand plusieurs fichiers sont liés en dur à la même inode et écrit une entrée HardLink pour les fichiers suivants au lieu de dupliquer le contenu du fichier.

À l’aide du même code que celui indiqué dans la section Comportement précédent , le résultat contient archive.tar maintenant une entrée de fichier complète pour file1.txt, tandis qu’il file2.txt a une HardLink entrée pointant vers file1.txt.

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Ce changement améliore l’efficacité des archives tar créées par la System.Formats.Tar bibliothèque. En utilisant les entrées <System.Formats.Tar.TarEntryType.HardLink> pour les fichiers qui partagent le même inode, la taille de l’archive résultante est réduite et les relations entre les fichiers sont conservées. Ce comportement est cohérent avec le tar GNU et d’autres implémentations de tar largement utilisées.

Si votre application dépend de la duplication du contenu des fichiers avec des liens physiques, vous pouvez restaurer le comportement précédent. Définir la propriété HardLinkMode à TarHardLinkMode.CopyContents dans une nouvelle instance TarWriterOptions :

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’extraction d’une archive tar contenant des entrées HardLink dans un système de fichiers sans prise en charge des liens physiques lève un IOException. Utilisez la nouvelle TarExtractOptions classe pour spécifier s’il faut extraire des liens durs en tant que liens durs ou les copier en tant que fichiers distincts. Cela permet l’extraction vers des systèmes de fichiers sans prise en charge des liens matériels.

API affectées