블로그 이미지
훅크선장

카테고리

분류 전체보기 (362)
사진이야기 (23)
펭귄컴퓨팅 (121)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

공지사항

태그목록

최근에 올라온 글

델파이에서도 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);

스트림과는 다르게, 파일에서 파일로 압축해제는 입력값이 압축된 파일과 압축파일이 풀려질 디렉토리  즉 경로만 필요합니다.


Posted by 훅크선장
, |