Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 파일 압축 및 압축 해제하기: GZipStream 완벽 가이드

C#에서는 System.IO.Compression 네임스페이스를 활용하여 파일을 손쉽게 압축하고 압축 해제할 수 있습니다. 이 글에서는 GZipStream 클래스와 FileStream 클래스를 함께 사용하는 방법을 예제 코드와 함께 자세히 살펴보겠습니다.

파일 압축하기 (Compress)

파일을 ZIP 형식으로 압축하려면 GZipStream 클래스와 FileStream 클래스를 함께 사용합니다. 이때 설정해야 할 매개변수는 다음과 같습니다.

  • 압축할 원본 파일
  • 출력될 압축 파일의 이름

아래 예제에서 outputFile은 결과로 생성되는 출력 파일이며, 원본 파일의 내용이 FileStream을 통해 읽혀집니다.

압축 예제 코드

using(var compress = new GZipStream(outputFile, CompressionMode.Compress, false)) {
   byte[] b = new byte[inFile.Length];
   int read = inFile.Read(b, 0, b.Length);
   while (read > 0) {
      compress.Write(b, 0, read);
      read = inFile.Read(b, 0, b.Length);
   }
}

코드의 동작 방식을 간단히 설명하면, 원본 파일에서 데이터를 버퍼(byte[]) 단위로 읽어 들인 후, 읽은 바이트 수가 0보다 큰 동안 계속해서 GZipStream에 기록합니다. 모든 데이터가 처리되면 while 루프가 종료되고 압축이 완료됩니다.

파일 압축 해제하기 (Decompress)

압축 해제 역시 동일한 GZipStream 클래스를 사용합니다. 이 경우에는 다음 두 가지 매개변수를 설정해야 합니다.

  • 원본(압축된) 파일
  • 출력될 파일의 이름

먼저 소스 ZIP 파일로부터 GZipStream을 엽니다.

using (var zip = new GZipStream(inStream, CompressionMode.Decompress, true))

압축 해제 시에는 루프를 사용하여 스트림에 남아 있는 데이터가 없을 때까지 반복적으로 읽습니다. 읽어 들인 데이터를 출력 스트림에 기록하면 최종적으로 파일이 생성되는데, 이 파일이 바로 압축이 해제된 결과물입니다.

압축 해제 예제 코드

using(var zip = new GZipStream(inputStream, CompressionMode.Decompress, true)) {
   byte[] b = new byte[inputStream.Length];
   while (true) {
      int count = zip.Read(b, 0, b.Length);
      if (count != 0)
      outputStream.Write(b, 0, count);
      if (count != b.Length)
      break;
   }
}

위 코드에서는 zip.Read() 메서드가 반환하는 바이트 수(count)를 확인합니다. 읽은 데이터가 있으면 출력 스트림에 기록하고, 읽은 바이트 수가 버퍼 크기보다 작으면 더 이상 읽을 데이터가 없다는 의미이므로 루프를 종료합니다.

마무리

C#의 System.IO.Compression 네임스페이스에 포함된 GZipStream 클래스를 사용하면 별도의 외부 라이브러리 없이도 파일 압축과 압축 해제를 효율적으로 구현할 수 있습니다. 대용량 파일을 다룰 때는 위 예제처럼 버퍼 단위로 데이터를 읽고 쓰는 방식을 사용하면 메모리 사용량을 절약할 수 있다는 점도 기억해 두시기 바랍니다.