본문 바로가기
Delphi, RadStudio

[개발/delphi] 델파이 zlib 를 이용한 파일압축

by SB리치퍼슨 2012. 1. 17.
[개발/delphi] 델파이 zlib 를 이용한 파일압축

// TCompressionStream 사용법

출처: http://wearethebest.co.kr/zbxe/3081


파일의 압축을 예로 들면 대강 다음과 같습니다..

1. 원본 파일 스트림을 생성한다.
2. 압축될 복사본 파일 스트림을 생성한다.
3. TCompressionStream 스트림 을 생성한다. 이 때 복사본 파일 스트림을 인자로 준다.
4. TCompressionStream에 원본 파일을 써 준다.
5. 생성한 스트림들을 해제한다.

압축된 파일을 읽을 때는 다음 순서가 되구요..

1. 압축된 원본 파일 스트림 생성.
2. 압축이 풀릴 복사본 파일 스트림 생성.
3. TDecompressionStream을 생성. 이 때 압축된 원본 파일 스트림을 인자로 준다.
4. TDecompressionStream 의 Read 메소드를 리턴값이 0일 때 까지 계속 호출해 해당 데이터를 복사본 파일 스트림에 쓴다.
5. 생성한 스트림들을 해제한다.


Uses 
  ... , ZLib;

// 파일의 압축
procedure ShrinkFile(Const Src, Dest : String;
  CompressionLevel: TCompressionLevel);
var
  InFile: TStream;
  OutFile: TStream;
  ZStream: TCustomZLibStream;
begin
  InFile := TFileStream.Create(Src, fmOpenRead);
  try
    OutFile := TFileStream.Create(Dest, fmCreate);
    try
      ZStream := TCompressionStream.Create(CompressionLevel, OutFile);
      try
        ZStream.CopyFrom(InFile, 0);

      finally
        ZStream.Free;
      end;
    finally
      OutFile.Free;
    end;
  finally
    InFile.Free;
  end;
end;

// 파일의 압축 해제
procedure ExpandFile(Const Src, Dest : String);
const
  BufferSize = 4096;
var
  InFile: TStream;
  OutFile: TStream;
  ZStream: TCustomZLibStream;
  Buffer: array[0..BufferSize-1] of Byte;
  Count: Integer;
begin
  InFile := TFileStream.Create(Src, fmOpenRead);
  try
    OutFile := TFileStream.Create(Dest, fmCreate);
    try
      ZStream := TDecompressionStream.Create(InFile);
      try
        while True do
        begin
          Count := ZStream.Read(Buffer, BufferSize);
          if Count <> 0 then
            OutFile.WriteBuffer(Buffer, Count)
          else Break;
        end;
      finally
        ZStream.Free;
      end;
    finally
      OutFile.Free;
    end;
  finally
    InFile.Free;
  end;
end; 

반응형

댓글