Result := mStream.Size - vPosition; //增量
一行可能有问题,改为:Result := mStream.Size - vPosition+1; //增量
试试。
一行可能有问题,改为:Result := mStream.Size - vPosition+1; //增量
试试。
解决方案 »
- 找错!添加BLOB字段的时候怎么会出现'无法在关闭的数据集上操作'
- Delphi达人进-怎么把StringGrid里的数据写到数据库中的一个表里?
- 在2000系统上如何安装midas中的server程序? 在线等待!! 急!!!
- application类的bringtofront方法
- 哪位同志有数据库相关联的时间控件/或好的方法,好用的话多给分
- ****** 问个问题 *******
- 请问什么属性可以使StringGrid的一列的内容按居中方式排齐?
- 如何才能使datetimepicker控件所显示的日期为当前日期?
- 控件求助
- 诚邀程序员、有识之士加盟合作!
- 求救,关于用DELPHI6开发WEBSERVICE的问题
- 双向链表的类,不知道怎么用法
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Zlib,
StdCtrls;type
TMyFileStruct=record
FileName:String[125];
FileSize:Integer;
end;
TForm1 = class(TForm)
OD: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
procedure CompressStream(SourceStream,DeskStream:TStream);//压缩
var
CompStream:TCompressionStream;
begin
DeskStream.Position :=0;
CompStream:=TCompressionStream.Create(clMax,DeskStream);
SourceStream.Position :=0;
CompStream.CopyFrom(SourceStream,SourceStream.Size);
CompStream.Free;
DeskStream.Position :=0;
end; procedure DeCompressStream(SourceStream, DeskStream: TStream);//解压缩
const
SixK=$ffff;
var
DeCompStream:TDecompressionStream;
Data:array[1..SixK] of Char;
Count:Integer;
begin
SourceStream.Position:=0;
DeCompStream:=TDecompressionStream.Create(SourceStream);
DeskStream.Position :=0;
try
repeat
Count:=DeCompStream.Read(Data,SixK);
if Count>0 then DeskStream.Write(Data,Count);
until Count=0;
finally
DeCompStream.Free;
end;
DeskStream.Position :=0;
end;procedure CompressFiles(FileNames:TStrings;DeskStream:TStream);
var
FileNum,i,CurrentPos:Integer;
FS:TMyFileStruct;
TempStream:TMemoryStream;
FileStream:TFileStream;
begin
TempStream:=TMemoryStream.Create;
FileNum:=FileNames.Count;
DeskStream.WriteBuffer(FileNum,SizeOf(FileNum));
CurrentPos:=FileNum*SizeOf(TMyFileStruct)+SizeOf(FileNum);
for i:=0 to FileNum-1 do
begin
FS.FileName:=ExtractFileName(FileNames[i]);
TempStream.Clear;
FileStream:=TFileStream.Create(FileNames[i],fmShareDenyRead);
CompressStream(FileStream,TempStream);
DeskStream.Position:=i*SizeOf(FS)+SizeOf(FileNum);
FS.FileSize:=TempStream.Size;
DeskStream.WriteBuffer(FS,SizeOf(FS));
DeskStream.Position:=CurrentPos;
CurrentPos:=CurrentPos+DeskStream.CopyFrom(TempStream,0);
FileStream.Free;
end;
TempStream.Free;
end;
procedure DeCompressFiles(DirStr:String;DeskStream:TStream);
var
FileNum,i,CurrentPos:Integer;
FS:TMyFileStruct;
SourceStream,TempStream:TMemoryStream;
begin
TempStream:=TMemoryStream.Create;
SourceStream:=TMemoryStream.Create;
DeskStream.ReadBuffer(FileNum,SizeOf(FileNum));
CurrentPos:=FileNum*SizeOf(FS)+SizeOf(FileNum);
for i:=0 to FileNum-1 do
begin
DeskStream.Position:=i*SizeOf(FS)+SizeOf(FileNum);
DeskStream.ReadBuffer(FS,SizeOf(FS));
SourceStream.Clear;
DeskStream.Position :=CurrentPos;
CurrentPos:=CurrentPos+SourceStream.CopyFrom(DeskStream,FS.FileSize);
TempStream.Clear;
DeCompressStream(SourceStream,TempStream);
TempStream.SaveToFile(DirStr+FS.FileName);
end;
SourceStream.Free;
TempStream.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
var
f:TMemoryStream;
begin
f:=TMemoryStream.Create;
if OD.Execute then
begin
CompressFiles(OD.Files,f);
end;
f.Position:=0;
DeCompressFiles('d:\',f);//测试
end;end.