Delphi文件/流的加密解密方法

(*

* 单元说明: 文件/流的加密解密方法(For Delphi 6-7)

*

* 软件来源: http://www.go-neumann.com/

* http://www.inbytes.net/

*

* 作 者: neumann@163.com

*

* 使用说明: 此文件的代码可以直接编译使用,

* 您可以根据需要编写自己的加密/解密代码.

*

* 声 明: 以下代码属作者原创, 请转载时保留本信息.

*

*)

unit uCompress;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, ComCtrls, Dialogs;

// 压缩/解压文件

procedure CompressFile(Source, Target: String); stdcall;

procedure DecompressFile(Source, Target: String); stdcall;

// 压缩/解压文件到流

procedure CompressToStream(FileName: String; Stream: TStream); stdcall;

procedure DecompressToStream(FileName: String; Stream: TStream); stdcall;

// 压缩/解压流

procedure CompressStream(InStream, OutStream: TStream); stdcall;

procedure DecompressStream(InStream, OutStream: TStream); stdcall;

implementation

uses

ZLib;

const

COMPRESS_ERROR = '压缩文件时出现内部错误:';

DECOMPRESS_ERROR = '解压文件时出现内部错误:';

COMPRESS_STRM_ERROR = '压缩流时出现内部错误:';

DECOMPRESS_STRM_ERROR = '解压流时出现内部错误:';

BufSize = $4096;

// 压缩文件

procedure CompressFile(Source, Target: String);

var

i: Integer;

Buf: array[0..BufSize] of byte;

ComStream: TCompressionStream;

InStream, OutStream: TFileStream;

begin

if not FileExists(Source) then

Exit;

InStream := Nil;

OutStream := nil;

ComStream := nil;

try

// 生成流

InStream := TFileStream.Create(Source, fmOpenRead OR fmShareDenyNone);

OutStream := TFileStream.Create(Target, fmCreate OR fmShareDenyWrite);

ComStream := TCompressionStream.Create(clMax, OutStream);

// 压缩流

for i := 1 to (InStream.Size div BufSize) do begin

InStream.ReadBuffer(Buf, BufSize);

ComStream.Write(Buf, BufSize);

end;

i := InStream.Size mod BufSize;

if (i > 0) then begin

InStream.ReadBuffer(Buf, i);

ComStream.Write(Buf, i);

End;

InStream.Free;

InStream := nil;

// 注先后

ComStream.Free;

ComStream := nil;

// 在此写加密流代码(要先释放 ComStream)

// EncryptStream(OutStream);

OutStream.Free;

OutStream := nil;

except

on E: Exception do begin

if (InStream <> nil) then

InStream.Free;

if (OutStream <> nil) then

OutStream.Free;

if (ComStream <> nil) then

ComStream.Free;

MessageDlg(COMPRESS_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

// 解压文件

procedure DecompressFile(Source, Target: String);

var

i: Integer;

Buf: array[0..BufSize] of Byte;

DecomStream: TDecompressionStream;

MemStream: TMemoryStream;

OutStream: TFileStream;

begin

if not FileExists(Source) then

Exit;

MemStream := Nil;

OutStream := nil;

DecomStream := nil;

try

// 生成流

// 先读文件到 MemStream 中解密(Source 只读).

// DecomStream 的开始位置 = MemStream.Position

MemStream := TMemoryStream.Create;

MemStream.LoadFromFile(Source);

// 在此写解密流代码

// DecryptStream(MemStream);

OutStream := TFileStream.Create(Target, fmCreate or fmShareDenyWrite);

DecomStream := TDeCompressionStream.Create(MemStream);

{ InStream := TFileStream.Create(Source, fmOpenRead or fmShareDenyNone);

OutStream := TFileStream.Create(Target, fmCreate or fmShareDenyWrite);

DecomStream := TDeCompressionStream.Create(InStream); }

// 解压流

repeat

i := DecomStream.Read(Buf, BufSize);

OutStream.WriteBuffer(Buf, i);

until (i = 0);

// 注意先后

OutStream.Free;

OutStream := nil;

DecomStream.Free;

DecomStream := nil;

MemStream.Free;

MemStream := Nil;

except

on E: Exception do begin

if (MemStream <> nil) then

MemStream.Free;

if (OutStream <> nil) then

OutStream.Free;

if (DecomStream <> nil) then

DecomStream.Free;

MessageDlg(DECOMPRESS_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

// 压缩文件到流

procedure CompressToStream(FileName: String; Stream: TStream);

var

i: Integer;

Buf: array[0..BufSize] of byte;

ComStream: TCompressionStream;

InStream: TFileStream;

begin

if not FileExists(FileName) then

Exit;

InStream := Nil;

ComStream := nil;

try

// 生成流

InStream := TFileStream.Create(FileName, fmOpenRead OR fmShareDenyNone);

ComStream := TCompressionStream.Create(clMax, Stream);

// 压缩流

for i := 1 to (InStream.Size div BufSize) do begin

InStream.ReadBuffer(Buf, BufSize);

ComStream.Write(Buf, BufSize);

end;

i := InStream.Size mod BufSize;

if (i > 0) then begin

InStream.ReadBuffer(Buf, i);

ComStream.Write(Buf, i);

End;

InStream.Free;

InStream := nil;

ComStream.Free;

ComStream := nil;

// 在此写加密流代码(要先释放 ComStream), Postion = 0

// EncryptStream(Stream);

except

on E: Exception do begin

if (InStream <> nil) then

InStream.Free;

if (ComStream <> nil) then

ComStream.Free;

MessageDlg(COMPRESS_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

// 解压文件到流

procedure DecompressToStream(FileName: String; Stream: TStream);

var

i: Integer;

Buf: array[0..BufSize] of Byte;

DecomStream: TDecompressionStream;

MemStream: TMemoryStream;

begin

if not FileExists(FileName) then

Exit;

MemStream := Nil;

DecomStream := nil;

try

// 生成流

// 先读文件到 MemStream 中解密(FileName 只读).

// DecomStream 的开始位置 = MemStream.Position

MemStream := TMemoryStream.Create;

MemStream.LoadFromFile(FileName);

// 在此写解密流代码

// DecryptStream(MemStream);

DecomStream := TDeCompressionStream.Create(MemStream);

// 解压流, Postion = 0

repeat

i := DecomStream.Read(Buf, BufSize);

Stream.WriteBuffer(Buf, i);

until (i = 0);

Stream.Position := 0;

DecomStream.Free;

DecomStream := nil;

MemStream.Free;

MemStream := Nil;

except

on E: Exception do begin

if (MemStream <> nil) then

MemStream.Free;

if (DecomStream <> nil) then

DecomStream.Free;

MessageDlg(DECOMPRESS_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

// 压缩流

procedure CompressStream(InStream, OutStream: TStream);

var

i: Integer;

Buf: array[0..BufSize] of byte;

ComStream: TCompressionStream;

begin

ComStream := Nil;

try

InStream.Position := 0;

ComStream := TCompressionStream.Create(clMax, OutStream);

for i := 1 to (InStream.Size div BufSize) do begin

InStream.ReadBuffer(Buf, BufSize);

ComStream.Write(Buf, BufSize);

end;

i := InStream.Size mod BufSize;

if (i > 0) then begin

InStream.ReadBuffer(Buf, i);

ComStream.Write(Buf, i);

End;

ComStream.Free;

ComStream := nil;

// 在此写加密流代码

// EncryptStream(OutStream);

except

on E: Exception do begin

if (ComStream <> nil) then

ComStream.Free;

MessageDlg(COMPRESS_STRM_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

// 解压流

procedure DecompressStream(InStream, OutStream: TStream);

var

i: Integer;

Buf: array[0..BufSize] of Byte;

DecomStream: TDecompressionStream;

begin

DecomStream := nil;

try

// 在此写解密流代码

// DecryptStream(InStream);

DecomStream := TDeCompressionStream.Create(InStream);

repeat

i := DecomStream.Read(Buf, BufSize);

OutStream.WriteBuffer(Buf, i);

until (i = 0);

OutStream.Position := 0;

DecomStream.Free;

DecomStream := nil;

except

on E: Exception do begin

if (DecomStream <> nil) then

DecomStream.Free;

MessageDlg(DECOMPRESS_STRM_ERROR + #10 + E.Message, mtError, [mbOk], 0);

end;

end;

end;

end.