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


本文整理自网络,侵删。

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


*
* 使用说明: 此文件的代码可以直接编译使用,
* 您可以根据需要编写自己的加密/解密代码.
*
* 声 明: 以下代码属作者原创, 请转载时保留本信息.
*
*)

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.

相关阅读 >>

Delphi 读取png base64编码文件生成图片

Delphi 自动升级组件autoupgrader简单教程

Delphi中webbrowser的用法

Delphi 病毒

Delphi 如何使用sendmessage发送后台组合键消息(ctrl+xxx)

Delphi xe 无法编译apk提示sdk路径问题时?sdk路径配置方法

Delphi 10.4.1的编译器bug终于修正了!

Delphi 根据经纬度计算地球上两点之间的距离

Delphi 操作系统时间与web标准时间校正

Delphi webservices传base64字串

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...