tar.gztarというフォーマットで複数のファイルをアーカイブした後にgzipので圧縮したファイルのことを指します。

C#でtar.gzを解凍・展開するということがあったので忘れないようにメモ。ちなみに、解凍・展開という言い方でいいのかどうかわかんない。

調べた結果.NET Frameworkの標準ライブラリでtarを展開する方法はなさそうでした。gzipだけならSystem.IO.CompressionGZipStreamで圧縮・解凍できます。

tarを展開するには、SharpZipLibというライブラリを使うとよいというアドバイスが多かったです。Stackoverflowでは。このライブラリが最もメジャーらしいです。monoにも対応してるようです。

GitHubのリポジトリを見る限り、10年開発が続いていて、約2ヵ月前にもプルリクがマージされてるので将来的にも大丈夫だろうということでこいつを使うことにしました。

NuGetでインストールしたらwikiのサンプルを参考にしてコードを書きます。

コード

1
using System.IO;
2
using System.IO.Compression;
3
using ICSharpCode.SharpZipLib.Tar;
4
5
...
6
7
//tar.gzを読み取り専用で開く
8
using (var tgzStream = File.OpenRead(@"D:\hoge.tar.gz"))
9
//GZipStreamオブジェクトを解凍で生成
10
using (var gzStream = new GZipStream(tgzStream, CompressionMode.Decompress))
11
using (var tarArchive = TarArchive.CreateInputTarArchive(gzStream))
12
{
13
    //指定したディレクトリにtarを展開
14
    tarArchive.ExtractContents(@"D:\hoge\");
15
}

wikiのサンプルからは下記を変更してます。

  • Closeではなくusingを使用
  • gzipの解凍はICSharpCode.SharpZipLib.GZipではなくSystem.IO.CompressionGZipStreamを使用

今回書いてて初めてusingを重ねて(見た目上ネストさせずに)書くことができるのを知りました。