[C#] Zip 압축 해제 코드 소스


Development note/C#  2019. 5. 10. 23:27

안녕하세요. 명월입니다.

 

이번 포스팅에서는 압축 해제하는 글입니다. 이전 포스팅에서 압축하는 방법에 대해 소개한 적이 있습니다.

링크 - C# Zip 압축 코드 소스

 

위 링크에서 소개한 바처럼 Zip 알고리즘은 자주 사용하는 알고리즘입니다. 해제 방법도 Ionic 라이브러리를 이용하는 방법과 내부 표준 라이브러리를 이용하는 방법을 소개하겠습니다.

먼저 Ionic 라이브러리를 이용해서 압축을 해제하는 방법입니다.

 

Nuget을 이용해서 Ionic를 다운, 참조합니다.

그리고 소스는 다음과 같이 작성했습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Ionic.Zip;

namespace CS_ZipExtractSource
{
    class Program
    {
        /// <summary>
        /// Ionic 라이브러리로 압축풀기
        /// </summary>
        /// <param name="zipPath"></param>
        /// <param name="destinationPath"></param>
        public static void ExtractZipByIonic(string zipPath, string destinationPath)
        {
            if (!Directory.Exists(destinationPath))
            {
                Directory.CreateDirectory(destinationPath);
            }
            using (var zip = new Ionic.Zip.ZipFile(zipPath))
            {
                zip.ExtractAll(destinationPath);
            }
        }
        static void Main(string[] args)
        {
            ExtractZipByIonic(@"D:\work\ExtractTest\target.zip", @"D:\work\ExtractTest\Ionic");
            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }
    }
}

소스가 압축하는 것에 비해 매우 단순하네요.

예제 파일을 준비하고 압축을 해제하겠습니다.

위 이미지처럼 압축 해제가 잘 되었습니다.

 

이번에는 표준 라이브러리를 이용해서 압축 해제하겠습니다.

먼저 System.IO.Commpress와 System.IO.Comppression.FileSystem을 추가합니다.

그리고 다음과 같이 소스를 작성했습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Compression;

namespace CS_ZipExtractSource
{
    class Program
    {
        /// <summary>
        /// 내부 라이브러리로 압축 풀기
        /// </summary>
        /// <param name="zipPath"></param>
        /// <param name="destinationPath"></param>
        public static void ExtractZipByIO(string zipPath, string destinationPath)
        {
            if (!Directory.Exists(destinationPath))
            {
                Directory.CreateDirectory(destinationPath);
            }
            using (ZipArchive zip = System.IO.Compression.ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in zip.Entries)
                {
                    var filepath = Path.Combine(destinationPath, entry.FullName);
                    var subDir = Path.GetDirectoryName(filepath);
                    if (!Directory.Exists(subDir))
                    {
                        Directory.CreateDirectory(subDir);
                    }
                    entry.ExtractToFile(filepath);
                }
            }
        }
        static void Main(string[] args)
        {
            ExtractZipByIO(@"D:\work\ExtractTest\target.zip", @"D:\work\ExtractTest\IO");
            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }
    }
}

위에서 사용한 예제 파일을 이용해서 실행시켜 봅니다.

위와 같은 결과가 나왔습니다.

 

압축하는 소스와 다르게 압축 해제는 소스 스탭 수가 확연히 차이가 있네요. Ionic에 비해 표준 라이브러리는 파일 하나하나에 Stream을 받아서 IO로 작성합니다. Ionic은 함수 하나 호출에 전체가 해제됩니다.

Ionic의 이벤트를 보면 압축 해제할 때마다 이벤트가 호출되어 해체 경과를 확인할 수 있네요. 그에 비해 표준 라이브러리는 그런 이벤트가 지원되지 않고 직접 작성해야 합니다.

크게 "라이브러리에서 다 처리하겠다" 와 "라이브러리에서 기본적인 처리만 하고 나머지는 유저에 맡긴다"의 차이인데 취향에 따라 사용하면 되겠네요.

 

개인적으로 외부 오픈 소스보다는 내부 표준 라이브러리가 더 좋습니다. 오픈 소스는 혹여나 버그가 발생하면 대응하기가 쉽지 않아서 이죠.

 

소스파일을 첨부합니다.

CS_ZipExtractSource.zip
0.00MB