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



unituCompress;

erface

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

//压缩/解压文件
procedureCompressFile(Source,Target:String);stdcall;
procedureDecompressFile(Source,Target:String);stdcall;

//压缩/解压文件到流
procedureCompressToStream(FileName:String;Stream:TStream);stdcall;
procedureDecompressToStream(FileName:String;Stream:TStream);stdcall;

//压缩/解压流
procedureCompressStream(InStream,OutStream:TStream);stdcall;
procedureDecompressStream(InStream,OutStream:TStream);stdcall;

implementation

uses
ZLib;

const
COMPRESS_ERROR=’压缩文件时出现内部:’;
DECOMPRESS_ERROR=’解压文件时出现内部:’;
COMPRESS_STRM_ERROR=’压缩流时出现内部:’;
DECOMPRESS_STRM_ERROR=’解压流时出现内部:’;
BufSize=$4096;

//压缩文件
procedureCompressFile(Source,Target:String);
var
i:Integer;
Buf:.gif' />[0..BufSize]of;
ComStream:TCompressionStream;
InStream,OutStream:TFileStream;
begin
notFileExists(Source)then
Exit;
InStream:=Nil;
OutStream:=nil;
ComStream:=nil;
try
//生成流
InStream:=TFileStream.Create(Source,fmOpenReadORfmShareDenyNone);
OutStream:=TFileStream.Create(Target,fmCreateORfmShareDenyWrite);
ComStream:=TCompressionStream.Create(clMax,OutStream);

//压缩流
fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;

i:=InStream.SizemodBufSize;
(i>0)thenbegin
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
onE:Exceptiondobegin
(InStream<>nil)then
InStream.Free;
(OutStream<>nil)then
OutStream.Free;
(ComStream<>nil)then [Page]
ComStream.Free;
MessageDlg(COMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;

//解压文件
procedureDecompressFile(Source,Target:String);
var
i:Integer;
Buf:.gif' />[0..BufSize]ofByte;
DecomStream:TDecompressionStream;
MemStream:TMemoryStream;
OutStream:TFileStream;
begin
notFileExists(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,fmCreateorfmShareDenyWrite);
DecomStream:=TDeCompressionStream.Create(MemStream);

{InStream:=TFileStream.Create(Source,fmOpenReadorfmShareDenyNone);
OutStream:=TFileStream.Create(Target,fmCreateorfmShareDenyWrite);
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
onE:Exceptiondobegin
(MemStream<>nil)then
MemStream.Free;
(OutStream<>nil)then
OutStream.Free;
(DecomStream<>nil)then
DecomStream.Free;
MessageDlg(DECOMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;

//压缩文件到流
procedureCompressToStream(FileName:String;Stream:TStream);
var
i:Integer;
Buf:.gif' />[0..BufSize]of;
ComStream:TCompressionStream;
InStream:TFileStream;
begin
notFileExists(FileName)then
Exit;
InStream:=Nil;
ComStream:=nil;
try
//生成流
InStream:=TFileStream.Create(FileName,fmOpenReadORfmShareDenyNone); [Page]
ComStream:=TCompressionStream.Create(clMax,Stream);

//压缩流
fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;

i:=InStream.SizemodBufSize;
(i>0)thenbegin
InStream.ReadBuffer(Buf,i);
ComStream.Write(Buf,i);
End;

InStream.Free;
InStream:=nil;

ComStream.Free;
ComStream:=nil;

//在此写加密流代码(要先释放ComStream),Postion=0
//EncryptStream(Stream);
except
onE:Exceptiondobegin
(InStream<>nil)then
InStream.Free;
(ComStream<>nil)then
ComStream.Free;
MessageDlg(COMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;

//解压文件到流
procedureDecompressToStream(FileName:String;Stream:TStream);
var
i:Integer;
Buf:.gif' />[0..BufSize]ofByte;
DecomStream:TDecompressionStream;
MemStream:TMemoryStream;
begin
notFileExists(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
onE:Exceptiondobegin
(MemStream<>nil)then
MemStream.Free;
(DecomStream<>nil)then
DecomStream.Free;
MessageDlg(DECOMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0); [Page]
end;
end;
end;

//压缩流
procedureCompressStream(InStream,OutStream:TStream);
var
i:Integer;
Buf:.gif' />[0..BufSize]of;


ComStream:TCompressionStream;
begin
ComStream:=Nil;
try
InStream.Position:=0;
ComStream:=TCompressionStream.Create(clMax,OutStream);

fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;

i:=InStream.SizemodBufSize;
(i>0)thenbegin
InStream.ReadBuffer(Buf,i);
ComStream.Write(Buf,i);
End;

ComStream.Free;
ComStream:=nil;

//在此写加密流代码
//EncryptStream(OutStream);
except
onE:Exceptiondobegin
(ComStream<>nil)then
ComStream.Free;
MessageDlg(COMPRESS_STRM_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;

//解压流
procedureDecompressStream(InStream,OutStream:TStream);
var
i:Integer;
Buf:.gif' />[0..BufSize]ofByte;
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
onE:Exceptiondobegin
(DecomStream<>nil)then
DecomStream.Free;
MessageDlg(DECOMPRESS_STRM_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;

end.
Tags:  文件加密解密算法 加密文件如何解密 文件夹加密解密 文件加密解密

延伸阅读

最新评论

发表评论