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

C#에서 GZIP 형식으로 파일 압축 및 압축 해제하는 방법

C#에서 파일을 GZIP 형식으로 압축하거나 압축을 해제하려면 GZipStream 클래스를 사용하면 됩니다. GZipStream은 System.IO.Compression 네임스페이스에 포함되어 있으며, FileStream 클래스와 함께 사용하면 파일 단위의 압축·압축 해제 작업을 간단하게 처리할 수 있습니다.

파일 압축하기

파일을 GZIP 형식으로 압축하려면 GZipStream 클래스에 FileStream 클래스를 조합해서 사용합니다. 이때 다음 두 가지를 지정해야 합니다.

  • 압축할 원본 파일
  • 결과로 저장될 압축 파일의 이름

아래 예제에서 outputFile은 생성될 압축 파일을 가리키며, 원본 파일(inFile)의 내용을 바이트 배열로 읽어 들인 후 GZipStream에 기록하는 방식으로 동작합니다.

예제

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);
    }
}

파일 압축 해제하기

압축 해제 역시 동일하게 GZipStream 클래스를 사용합니다. 이번에는 압축된 원본 파일과 결과로 저장될 파일의 이름을 지정하고, 압축 파일 스트림으로부터 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;
    }
}

참고 사항

  • GZipStream을 사용하려면 System.IO.Compression 네임스페이스를 참조해야 합니다.
  • CompressionMode 열거형에는 Compress(압축)와 Decompress(압축 해제) 두 가지 모드가 있습니다.
  • 압축된 스트림은 Length 속성을 지원하지 않는 경우가 많으므로, 실무에서는 전체 길이 대신 4096바이트 등 고정 크기 버퍼를 사용하는 것이 더 안전합니다.
  • using 블록을 활용하면 작업 종료 후 스트림이 자동으로 닫히고 리소스가 해제되므로 메모리 누수를 방지할 수 있습니다.