我想把一个文件夹下的所有文件压缩成一个文件,用什么结构好?(50分)

  • 主题发起人 主题发起人 lah998
  • 开始时间 开始时间
L

lah998

Unregistered / Unconfirmed
GUEST, unregistred user!
把单个文件压缩好后,如何把这一个个压缩好的文件连成一串,采用什么结构保存?
便于解压。分数不够可以加,谢谢!
 
可以直接用Vclzip呀,
可以用一个目录区和数据区,模仿文件系统
 
压缩我已经用zlib了,
 
试试VclZip吧!
 
vclzep是什麼呀,delphi中有這樣的控件嗎?
 
诸位:关键不是压缩的问题,是压缩后成一个个压缩文件时如何连成一个文件。
因为一个文件夹下有多个文件。
 
vclzip可以把指定目录下的所有文件压缩成一个文件啊。

你如果想要多个文件编程一个文件 就直接用 Tfilestream 把他们合并在一起
dos下的copy指令就是那么做的
 
xiaolin0522,:连成一个文件我可以办到,如何解压还原就难啊,
所以保存成什么结构还原就容易
 
长度,文件内容,长度,文件内容,。。。。,长度,文件内容。
 
Vclzip是操作标准zip文件的类
功能强大,可以满足你的要求,
你也不用去管底层的细节,
可以包含路径,可以进行加密
 
LiChaoHui:我是为了学习编程,不是为了这个压缩结果,不然我就用rar了。
一生中最爱:你看懂了我的意思不过一个文件如果太大了就会“扩大内存出错”
 
const
MAX = 1000;
Item = record
pos : Word;//说明这个文件处于哪个位置
Size : integer;//说明文件的大小
Name : array[0..40] of char;
end;
ItemList = record
Total : integer
//总共数量
List : array[0..MAX-1] of Item;
end;
这个就可以表示你流中的文件内容的信息啊
:)
在QQ上你怎么不给我回信?
 
天真,:如何解决大文件的问题?
 
天真,:同步用多线程不就可以搞定了!
 
delphi中string类型最大可达2G,一般应该够了。
若还不行的话,看看vclzip等控件是否行,若行的话,看看其源码相关部分,应该可以解决
 
举个例子:
假设我要压缩一个文件夹下的两个文件a.txt和b.txt
a.txt是20M因为太大不能一次调入内存就要一次读16K压缩。
因为压缩后每个16K是不一样大的,所以解压的时候就不知道每次读多少出
来解压,还有就是a.txt和b.txt的交界处怎么判定。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
aa = record
i : integer;
j : array [0..51] of char;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
FHandle : THandle;
MapHandle : THandle;
pData : pointer;

FSize : integer;
a : aa;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
FHandle := FileOpen('D:/1111.txt',fmOpenReadWrite);
// FHandle := CreateFile('d:/1111.txt', GENERIC_READ or GENERIC_WRITE, 0,
// nil,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if FHandle <> 0 then
Showmessage(inttostr(integer(FHandle)));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FSize := GetFileSize(FHandle,nil);
showmessage(inttostr(Fsize));

MapHandle := CreateFileMapping(FHandle,nil,PAGE_READWRITE,0,10000,nil);

if MapHandle <> 0 then
Showmessage('ok;')
else
Showmessage(inttostr(GetLastError));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
pData := MapViewofFile(MapHandle,FILE_MAP_ALL_ACCESS ,0,0,10000);

if Integer(pData)>0 then
Showmessage('ok;');
end;

procedure TForm1.Button4Click(Sender: TObject);
var p,p1 : pointer;
i : integer;
begin
Randomize;
p := pData;

a.i := 4;
a.j := 'fasdfasfdasfrqwreqw';
copyMemory(p,@a,SizeOf(aa));
p1 := p+Sizeof(aa);

for i:=0 to 9999-SizeOf(aa) do
begin
char(p1^) := char(Random(58)+32);
p1 := pointer(integer(p1)+1);
end;

end;

procedure TForm1.Button5Click(Sender: TObject);
begin
unmapViewofFile(pData);
CloseHandle(MapHandle);
CloseHandle(FHandle);
end;

end.

希望对你有一些启事,
 
定义:
rec=record
filename:string[255];
pos:Integer;
Size:Integer;
end;
吧所有文件合并后再这个文件尾部加上rec结构的信息,每个文件一个
最後在尾部再加一个Pos:Integer,记录第一个Rec的位置
使用合并后的文件时先读Pos,然后读第一个
REC,循环到最后一个即可
 
还有,我少了一下BUTTON6
procedure TForm1.Button4Click(Sender: TObject);
var p,p1 : pointer;
i : integer;
begin
p := pData;
copymemory(@a,p,SizeOf(aa));
showmessage(inttostr(a.i)+','+a.j);


end;
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部