TarWriter は、ハードリンクされたファイルに HardLink エントリを使用します

TarWriter では、複数のファイルが同じ inode にハードリンクされていることを検出するようになりました。 ファイルの内容を複製するのではなく、後続のファイルの HardLink エントリを書き込みます。

導入されたバージョン

.NET 11 Preview 3

以前の動作

以前は、 TarWriterを使用して tar アーカイブを作成する場合、同じ inode にハードリンクされたファイルは、独立した別個のファイルとして扱されていました。 完全なファイルコンテンツは、ハードリンクされた各ファイルのアーカイブに複製されました。

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

結果の archive.tarでは、 file1.txtfile2.txt の両方に個別のファイル エントリがあり、それぞれに完全なファイル コンテンツが含まれています。

新しい動作

.NET 11 以降では、TarWriter は、複数のファイルが同じ inode にハード リンクされていることを検出し、ファイル コンテンツを複製するのではなく、後続のファイルに対して HardLink エントリを書き込みます。

前の動作セクションに示したのと同じコードを使用して、結果のarchive.tarにはfile1.txtの完全なファイル エントリが含まれるようになりました。一方、file2.txtにはHardLinkを指すfile1.txtエントリがあります。

破壊的変更の種類

この変更は 動作の変更です。

変更理由

この変更により、 System.Formats.Tar ライブラリによって作成された tar アーカイブの効率が向上します。 同じ inode を共有するファイルの <System.Formats.Tar.TarEntryType.HardLink> エントリを使用すると、結果のアーカイブのサイズが小さくなり、ファイル間のハード リンク関係が保持されます。 この動作は、GNU tar およびその他の広く使用されている tar 実装と一致します。

アプリケーションがハードリンクされたファイルのファイル コンテンツの複製に依存している場合は、前の動作を復元できます。 HardLinkMode プロパティを新しいTarHardLinkMode.CopyContents インスタンスで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");
}

ファイル システムがハード リンクをサポートしていない場合、HardLink エントリを含む tar アーカイブを抽出すると、IOException エラーがスローされます。 新しい TarExtractOptions クラスを使用して、ハード リンクをハード リンクとして抽出するか、別のファイルとしてコピーするかを指定します。 これにより、ハード リンクがサポートされていないファイル システムへの抽出が可能になります。

影響を受ける API