世界一シンプルな C# / .NET 向け TAR アーカイブ作成ライブラリです。なんとアーカイブの作成しかできません。その代わりに unsafe
が不要(C# 7.3 以降)、追加の DLL
の導入も不要、バニラ C# で動きます。
有名どころのライブラリは Zip・GZip・RAR など複数のフォーマットに対応しているのは良いものの、Zip は既に不要だったり、多機能すぎてあらゆる操作が大仰になっていたりだったので、tar 作成部分だけを既存ライブラリから抜き出しました。
System.IO.Compression
がいまだに対応していない tar フォーマット、後方互換性のために tar アーカイブの書き出しだけは出来るように、という需要もまだまだあるでしょう。
使い方
TarStream
を開いて string、byte[] または Stream を書き込むだけで tar アーカイブが作れます。System.IO.Compression
と組み合わせて .tar.gz
(.tgz
)も作成できます。
using SatorImaging.TarArchiver;
using System;
using System.IO;
using System.IO.Compression;
public class Sample
{
static void Main(string[] args)
{
if (args.Length == 0 || string.IsNullOrWhiteSpace(args[0]))
throw new ArgumentNullException(nameof(args));
// open TAR stream and export as a .tar.gz format
using (var targz = new FileStream(args[0], FileMode.Create, FileAccess.Write))
using (var gzip = new GZipStream(targz, CompressionLevel.Optimal))
using (var tar = new TarStream(gzip))
{
// writing data
tar.Write(@"path/to/the/file.txt", @"Hello, World.");
tar.Write(@"path/with/multibyte/文字列.txt", @"ひらがなカタカナ漢字");
tar.Write(@"yet-another-folder/byteArray.txt", new byte[] { 84, 65, 82, 13, 10 }); //TAR[CR][LF]
tar.Write(@"root.txt", "");
tar.Flush(); // done in TarStream.Dispose() anyway
}
}
}
Unity
Unity 2021.3 でテスト。Unity Package Manager (UPM) を使う場合は以下のURLを。
- Lastest:
https://github.com/sator-imaging/CSharp-TarArchiver.git
- v1.0.0:
https://github.com/sator-imaging/CSharp-TarArchiver.git#v1.0.0
src/Sample.cs
がある状態だと Unity エディターにメニューが追加され、テストファイルを書き出すためのダイアログが使用できます。
TARアーカイブ
ロングネーム対応でちょっとヘッダーが面倒だけど、それ以外は単純。
ヘッダー+ファイルを書き込んで512kのブロックに足りない部分をゼロで埋める、をファイルの数だけ繰り返して最後に2ブロック(1024k)を 0 で埋めれば終わり。
1MiB を丸ごとゼロで埋める終端表現はかなりダイナミック。
tar - Format of tar archives - IBM Documentation
--
ヘッダーが固定長だったらスゲー楽に読み込み機能付けられるんだけも。
以上です。お疲れ様でした。