らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

C# で .tar.gz ファイルをオンメモリで処理する

C# で拡張子 .tar.gz のファイルを扱うには SharpZipLib を使うと便利です。 簡単なサンプルプログラムをメモしておきます。

実行ディレクトリに展開するサンプル

第一引数に指定された .tar.gz ファイルを実行ディレクトリに展開するサンプルは以下の通りです。

using ICSharpCode.SharpZipLib.Tar;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var tgzStream = File.OpenRead(args[0]))
            using (var gzStream = new GZipStream(tgzStream, CompressionMode.Decompress))
            using (var tarArchive = TarArchive.CreateInputTarArchive(gzStream, Encoding.UTF8))
            {
                tarArchive.ExtractContents(@".\");
            }
        }
    }
}

ファイル名だけ取得するサンプル

ファイル名だけ取得するサンプルは以下の通りです。

using ICSharpCode.SharpZipLib.Tar;
using System;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var tgzStream = File.OpenRead(args[0]))
            using (var gzStream = new GZipStream(tgzStream, CompressionMode.Decompress))
            using (var tarInputStream = new TarInputStream(gzStream, Encoding.ASCII))
            {
                TarEntry entry;
                while ((entry = tarInputStream.GetNextEntry()) != null)
                {
                    Console.WriteLine(entry.Name);
                }
            }
        }
    }
}

オンメモリで処理するサンプル

ファイルシステム上には展開せず、オンメモリだけで処理するサンプルです。 .tar.gz の内容をコンソールに出力します。 .tar.gz の内容はコンソールに出力可能なテキスト形式であることを想定しています。

using ICSharpCode.SharpZipLib.Tar;
using System;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var tgzStream = File.OpenRead(args[0]))
            using (var gzStream = new GZipStream(tgzStream, CompressionMode.Decompress))
            using (var tarInputStream = new TarInputStream(gzStream, Encoding.ASCII))
            {
                int index = 0;
                TarEntry entry;
                while ((entry = tarInputStream.GetNextEntry()) != null)
                {
                    using (var contents = new MemoryStream())
                    {
                        tarInputStream.CopyEntryContents(contents);
                        Console.WriteLine("[" + ++index + "]:" + entry.Name + " (" + contents.Length + ")");
                        Console.WriteLine(Encoding.UTF8.GetString(contents.ToArray()));
                    }
                }
            }
        }
    }
}