C#でTGZやTARを作成

.NET(C#)でフォルダごとTGZやTARにまとめる方法を紹介します。
同様のサンプルは様々なところで取り上げられていますが、ファイルを絶対パスのまま登録しているため、任意の場所に解凍できなくなってしまうという状態でしたので、少し修正しました。

このコードはSharpZipLibというライブラリを使用します。

http://www.icsharpcode.net/opensource/sharpziplib/

TGZのサンプル。TarArchiveに登録するエントリの名前を相対パスに変換しています。

        /// <summary>
        /// Creates a GZipped Tar file from a source directory
        /// </summary>
        /// <param name="outputTarFilename">Output .tar.gz file</param>
        /// <param name="sourceDirectory">Input directory containing files to be added to GZipped tar archive</param>
        public void CreateTar(string outputTarFilePath, string sourceDirectory)
        {
            using (FileStream fs = new FileStream(outputTarFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
            using (Stream gzipStream = new GZipOutputStream(fs))
            using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(gzipStream))
            {
                tarArchive.SetKeepOldFiles(true);
                //tarArchive.AsciiTranslate = false;
                AddDirectoryFilesToTar(tarArchive, sourceDirectory, sourceDirectory, true);
            }
        }

        /// <summary>
        /// Recursively adds folders and files to archive
        /// </summary>
        /// <param name="tarArchive"></param>
        /// <param name="sourceDirectory"></param>
        /// <param name="recurse"></param>
        private void AddDirectoryFilesToTar(TarArchive tarArchive, string rootDirectory, string sourceDirectory, bool recurse)
        {
            // Recursively add sub-folders
            if (recurse)
            {
                string[] directories = Directory.GetDirectories(sourceDirectory);
                foreach (string directory in directories)
                    AddDirectoryFilesToTar(tarArchive, rootDirectory, directory, recurse);
            }

            // Add files
            string[] filenames = Directory.GetFiles(sourceDirectory);
            foreach (string filename in filenames)
            {
                TarEntry tarEntry = TarEntry.CreateEntryFromFile(filename);
                tarEntry.Name = filename.Remove(0, rootDirectory.Length);
                tarArchive.WriteEntry(tarEntry, true);
            }
        }

TARのサンプル。上記との違いは、GZIPを使わずにTarArchiveに渡すところだけです。

        /// <summary>
        /// Creates a GZipped Tar file from a source directory
        /// </summary>
        /// <param name="outputTarFilename">Output .tar.gz file</param>
        /// <param name="sourceDirectory">Input directory containing files to be added to GZipped tar archive</param>
        public void CreateTar(string outputTarFilePath, string sourceDirectory)
        {
            using (FileStream fs = new FileStream(outputTarFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
            using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(fs))
            {
                tarArchive.SetKeepOldFiles(true);
                //tarArchive.AsciiTranslate = false;
                AddDirectoryFilesToTar(tarArchive, sourceDirectory, sourceDirectory, true);
            }
        }

This entry was posted in 未分類 and tagged . Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>