[C# 문법] C# ZIP(압축파일) 파일 다루기

소개

  • 안녕하세요. 오늘은 C# 문법에서 .ZIP 파일, 압축파일을 다루는 방법에 대해서 알려 드리려고 합니다.
  • 프로젝트를 하다보면, 파일을 많이 다루게 되고 또한 압축 파일도 다루는 경우들이 필요한데요. 이럴때 매우 유용한 기능이라고 생각합니다.
  • 또한, .NET 프레임워크 4.5 부터 ZIP 아카이브 파일을 처리하는 클래스가 추가되어 보다 더 손쉽게 ZIP 파일을 다룰 수 있습니다.


1. 압축파일의 파일 목록 구하기

  • 첫 번째로, 압축파일의 파일 목록 구하는 방법에 대해서 알려드리겠습니다.
using System;
using System.IO.Compression;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var archiveFile = @"C:\Users\Desktop\test.zip";

            using (ZipArchive zip = ZipFile.OpenRead(archiveFile))
            {
                var entries = zip.Entries;

                foreach (var item in entries)
                {
                    Console.WriteLine(item.FullName);
                }
            }
        }
    }
}
BenchMarkTest/.vs/
BenchMarkTest/.vs/BenchMarkTest/
BenchMarkTest/.vs/BenchMarkTest/DesignTimeBuild/
BenchMarkTest/.vs/BenchMarkTest/DesignTimeBuild/.dtbcache.v2
BenchMarkTest/.vs/BenchMarkTest/v16/
BenchMarkTest/.vs/BenchMarkTest/v16/.suo
BenchMarkTest/BenchMarkTest.sln
BenchMarkTest/BenchMarkTest/
BenchMarkTest/BenchMarkTest/BenchMarkTest.csproj
...
  • ZipFile 클래스에 있는 OpenRead 메서드를 사용하면 ZipArchive의 인스턴스를 생성할 수 있습니다.
  • 이 인스턴스에서 Entries 속성을 참조하면 아카이브에 저장된 파일의 목록을 구할 수 있습니다.
  • Entries 속성의 형은 다음과 같습니다.
  • 이후부터는 아카이브에 저장된 파일을 엔트리라고 합니다.


2. 압축파일에서 임의의 파일을 추출하기

  • 압축파일에서 임의 파일을 추출하는 방법에 대해서 알려 드리도록 하겠습니다.
using System.IO;
using System.IO.Compression;
using System.Linq;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var archiveFile = @"C:\Users\Desktop\test.zip";
            string name = "test";

            using (ZipArchive zip = ZipFile.OpenRead(archiveFile))
            {
                ZipArchiveEntry entries = zip.Entries.FirstOrDefault(x => x.Name.Contains(name));

                if (entries != null)
                {
                    var destPath = Path.Combine(@"C: \Users\Desktop\zip", entries.FullName);
                    Directory.CreateDirectory(Path.GetDirectoryName(destPath));
                    entries.ExtractToFile(destPath, overwrite: true);
                }
            }
        }
    }
}
  • 위와 같이 ZipArchiveEntry의 확장 메서드인 ExtractToFile메서드를 통해 파일에 씁니다.
  • ZipFile.OpenRead로 얻은 객체에 있는 Entries 속성의 형은 ReadOnlyCollection 입니다.
  • ReadOnlyCollection<T>IEnumerable<T> 인터페이스를 구현하므로 LINQ를 이용할 수 있습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY