델파이에서 GZip 압축( .gz 확장자 파일) 풀기
절름발이 프로그래머/Delphi / 2009. 12. 1. 16:55
델파이에서도 GZip 압축을 풀 수 있습니다.
GZip 압축은 .gz 확장자를 가지는 파일로 볼 수 있습니다.
공개된 zlib를 사용하는 것이 가장 좋습니다.
다만, zlib는 원래 GZip 용이 아니고, .Z 확장자를 가지는 압축파일을 다루는 라이브러리입니다.
델파이용 zlib는 다음 링크에서 받을 수 있습니다.
zlib 사용법에 대해서는 다른 분께서 이미 설명서를 잘 쓰셨습니다.
다만, zlib를 이용하여, GZip 압축을 푸는 방법이 잘 안 알려져 있을 뿐입니다.
다음과 같이 하면, 스트림을 이용하여, GZip 파일 압축을 풀 수 있습니다.
-- 에러 처리를 추가하였습니다. GZ 함수 계열이 모두 procedure 이다보니, 에러처리가 별도로 필요합니다. --
use ZlibEx, ZlibExGZ;
...
...
procedure TForm1.btn3Click(Sender: TObject);
var
InputFileName, OutputFilename : string;
InputStream : TFileStream;
OutputStream : TMemoryStream;
OutputSize : Int64;
begin
InputFileName := edt1.Text;
OutputFilename := edt2.Text;
InputStream := TFileStream.Create(InputFileName, fmOpenRead);
try
OutputStream := TMemoryStream.Create;
try
try
GZDecompressStream(InputStream, OutputStream);
OutputSize := OutputStream.Size;
except
on E : Exception do
begin
mmo1.Lines.Add(E.ClassName+' error raised, with message : '+E.Message);
OutPutSize := 0;
end;
end;
mmo1.Lines.Add(IntToStr(OutputSize));
OutputStream.SaveToFile(OutputFileName);
finally
OutputStream.Free;
end;
finally
InputStream.Free;
end;
end;
굳이 스트림을 사용하는 이유는 파일내용을 단순히 파일로 저장하기 보다는, 스트림으로 다른 곳에서 사용하는 경우가 더 많기 때문입니다.
그래서 일부러 위 예제에서는 메모리 스트림을 사용했습니다. 파일 스트림을 사용해도 결과는 동일합니다만, 스트림 생성때 인자가 틀립니다.
출력파일을 위한 파일스트림은 이렇게 생성합니다.
OutputStream := TFileStream.Create(OutputFileName, fmCreate);
단순히 파일로만 압축을 풀어서 저장하고 싶다면, 간단하게 함수 한번 호출로 끝납니다.
GZDecompressFile(InputFileName, OutputPath);
스트림과는 다르게, 파일에서 파일로 압축해제는 입력값이 압축된 파일과 압축파일이 풀려질 디렉토리 즉 경로만 필요합니다.