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 블록을 활용하면 작업 종료 후 스트림이 자동으로 닫히고 리소스가 해제되므로 메모리 누수를 방지할 수 있습니다.