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.txt と file2.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
.NET