一个例子: unit mgr;interfaceuses Windows, Messages, SysUtils, Classes, Forms, StdCtrls,shlobj, Controls, Dialogs,shellapi;type TForm1 = class(TForm) GroupBox1: TGroupBox; Button1: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Button3: TButton; GroupBox2: TGroupBox; ListBox1: TListBox; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean); procedure ListBox1DblClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } fstream1:tfilestream; fstream2:tfilestream; list:tstrings; len:tstrings; public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM} const flen=136192; //请注意修改这儿的长度type FILE_INFO=record filename:array[0..MAX_PATH] of char; len:integer; end;function SelectDirectory(handle:hwnd;const Caption: string; const Root: WideString;out Directory: string): Boolean; var lpbi:_browseinfo; buf:array [0..MAX_PATH] of char; id:ishellfolder; eaten,att:cardinal; rt:pitemidlist; initdir:pwidechar; begin result:=false; lpbi.hwndOwner:=handle; lpbi.lpfn:=nil; lpbi.lpszTitle:=pchar(caption); lpbi.ulFlags:=BIF_RETURNONLYFSDIRS+BIF_EDITBOX; SHGetDesktopFolder(id); initdir:=pwchar(root); id.ParseDisplayName(0,nil,initdir,eaten,rt,att); lpbi.pidlRoot:=rt; getmem(lpbi.pszDisplayName,MAX_PATH); try result:=shgetpathfromidlist(shbrowseforfolder(lpbi),buf); except freemem(lpbi.pszDisplayName); end; if result then begin directory:=buf; if length(directory)<>3 then directory:=directory+'\'; end; end;procedure TForm1.Button1Click(Sender: TObject); var info:FILE_INFO; i:integer; buf:array[0..4096] of byte; s:integer; begin if savedialog1.Execute then if opendialog1.Execute then begin try copyfile(pchar(paramstr(0)),pchar(savedialog1.FileName),false); fstream1:=tfilestream.Create(pchar(savedialog1.FileName),fmopenreadwrite); fstream1.Seek(flen,soFromBeginning); for i:=0 to opendialog1.Files.Count-1 do begin strpcopy(info.filename,extractfilename(opendialog1.files.strings[i])); fstream2:=tfilestream.Create(opendialog1.Files.Strings[i],fmopenread); info.len:=fstream2.Size; fstream1.Write(info,sizeof(info)); while fstream2.Position<>fstream2.Size do begin s:=fstream2.Read(buf,sizeof(buf)); fstream1.Write(buf,s); end; fstream2.Free; end; finally fstream1.Free; end; end; end;procedure TForm1.Button3Click(Sender: TObject); var f:textfile; info:FILE_INFO; i:integer; buf:array[0..4096] of byte; s:integer; count,b:integer; dir:string; begin if selectdirectory(handle,'选择输出文件夹','',dir) then try fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite); fstream1.Seek(flen,soFromBeginning); while fstream1.Position<>fstream1.Size do begin fstream1.Read(info,sizeof(info)); count:=0; assignfile(f,dir+info.filename); rewrite(f); closefile(f); fstream2:=tfilestream.Create(dir+info.filename,fmopenwrite); fstream2.Size:=0; i:=info.len div sizeof(buf); for b:=1 to i do begin s:=fstream1.Read(buf,sizeof(buf)); fstream2.Write(buf,s); inc(count,s); end; s:=fstream1.Read(buf,info.len-count); fstream2.Write(buf,s); fstream2.Free; end; finally fstream1.Free; end; end;procedure TForm1.FormCreate(Sender: TObject); var info:FILE_INFO; begin list:=tstringlist.Create; len:=tstringlist.Create; try fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite); fstream1.Seek(flen,soFromBeginning); while fstream1.Position<>fstream1.Size do begin fstream1.Read(info,sizeof(info)); list.Add(inttostr(fstream1.position)); len.Add(inttostr(info.len)); listbox1.Items.Add(info.filename); fstream1.Seek(info.len,soFromCurrent); end; finally fstream1.Free; end; if listbox1.Items.Count>0 then button3.Enabled:=true else button3.Enabled:=false; end;procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean); var f:integer; begin f:=filecreate(savedialog1.FileName); if f<=0 then begin MessageBox(handle,'不能选择输出到该文件!',pchar(application.Title),MB_OK+MB_ICONerror); canclose:=false; end; fileclose(f); end;procedure TForm1.ListBox1DblClick(Sender: TObject); var path:array[0..max_path] of char; filename:string; f,b,s,count:integer; buf:array[0..4096] of char; begin if button3.Enabled=false then exit; gettemppath(Max_path,path); filename:=path+listbox1.Items.Strings[listbox1.itemindex]; fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite); f:=filecreate(filename); fileclose(f); count:=0; fstream2:=tfilestream.Create(filename,fmopenwrite); fstream1.Seek(strtoint(list.Strings[listbox1.ItemIndex]),sofrombeginning); f:=strtoint(len.Strings[listbox1.itemindex]) div sizeof(buf); for b:=1 to f do begin s:=fstream1.Read(buf,sizeof(buf)); fstream2.Write(buf,s); inc(count,s); end; s:=fstream1.Read(buf,strtoint(len.Strings[listbox1.itemindex])-count); fstream2.Write(buf,s); fstream2.Free; shellexecute(handle,'open',pchar(filename),'','',sw_show); fstream1.Free; end;procedure TForm1.FormDestroy(Sender: TObject); var i:integer; path:array[0..max_path] of char; filename:string; begin list.Free; len.Free; gettemppath(Max_path,path); for i:=0 to listbox1.Items.Count-1 do begin filename:=path+listbox1.Items.Strings[i]; deletefile(filename); end; end;end.
unit unitFrmMain;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, FileCtrl;type TForm1 = class(TForm) OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; UpDown1: TUpDown; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; ListBox1: TListBox; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM} //选择待分割的文件procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Edit2.Text := OpenDialog1.FileName; end; end;//设置分割后的分卷文件的存储位置procedure TForm1.Button2Click(Sender: TObject); var Dir: string; begin if SelectDirectory('选择存储目录:', '', Dir) then begin Edit3.Text := Dir + '\'; end;end;//分割文件为分卷文件,自动命名procedure TForm1.Button3Click(Sender: TObject); var I, K, Rest, Len: Integer; AF, BF: TFileStream; //文件流对象 Fn: string; //文件名 Buf: Integer; //单碟容量 begin if (Edit2.Text = '') or (Edit3.Text = '') then begin Beep; Exit; end; //单碟容量计算为字节数 buf := StrToInt(Edit1.Text) * 1024; I := 1; try Af := TFileStream.Create(Edit2.Text, fmOpenRead); K := Af.Size div Buf; Rest := Af.Size - K * Buf; for I := 1 to K do begin Fn := Edit3.Text + IntToStr(I) + '.spt'; //文件名 Bf := TFileStream.Create(Fn, fmCreate); Bf.CopyFrom(Af, Buf); ListBox1.Items.Add(Fn); Bf.Free; end; if Rest > 0 then begin Fn := Edit3.Text + IntToStr(I) + '.spt'; Bf := TFileStream.Create(Fn, fmCreate); Bf.CopyFrom(Af, Rest); Bf.Free; ListBox1.Items.Add(Fn); end; finally AF.Free; end;end;//将分割后的分卷文件在列表框中显示procedure TForm1.Button4Click(Sender: TObject); var I: Integer; begin if OpenDialog1.Execute then for I := 0 to OpenDialog1.Files.Count - 1 do ListBox1.Items.Add(OpenDialog1.files[I]); end;//合并分卷文件并保存合并结果procedure TForm1.Button5Click(Sender: TObject); var Af, Bf: TFileStream; //文件流对象 Fn, Ft: string; //文件名 I: Integer; begin if ListBox1.Items.Count = 0 then begin Beep; Exit; end; if SaveDialog1.Execute then begin Fn := SaveDialog1.FileName; try Af := TFileStream.Create(Fn, fmCreate); for I := 0 to ListBox1.Items.Count - 1 do begin Ft := ListBox1.Items[I]; Bf := TFileStream.Create(Ft, fmOpenRead); Af.CopyFrom(Bf, Bf.Size); Bf.Free; end; finally Af.Free; end; end; end; end.
codeguru.com
很多
unit mgr;interfaceuses
Windows, Messages, SysUtils, Classes, Forms,
StdCtrls,shlobj, Controls, Dialogs,shellapi;type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button3: TButton;
GroupBox2: TGroupBox;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
procedure ListBox1DblClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
fstream1:tfilestream;
fstream2:tfilestream;
list:tstrings;
len:tstrings;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
const
flen=136192; //请注意修改这儿的长度type
FILE_INFO=record
filename:array[0..MAX_PATH] of char;
len:integer;
end;function SelectDirectory(handle:hwnd;const Caption: string; const Root: WideString;out Directory: string): Boolean;
var
lpbi:_browseinfo;
buf:array [0..MAX_PATH] of char;
id:ishellfolder;
eaten,att:cardinal;
rt:pitemidlist;
initdir:pwidechar;
begin
result:=false;
lpbi.hwndOwner:=handle;
lpbi.lpfn:=nil;
lpbi.lpszTitle:=pchar(caption);
lpbi.ulFlags:=BIF_RETURNONLYFSDIRS+BIF_EDITBOX;
SHGetDesktopFolder(id);
initdir:=pwchar(root);
id.ParseDisplayName(0,nil,initdir,eaten,rt,att);
lpbi.pidlRoot:=rt;
getmem(lpbi.pszDisplayName,MAX_PATH);
try
result:=shgetpathfromidlist(shbrowseforfolder(lpbi),buf);
except
freemem(lpbi.pszDisplayName);
end;
if result then
begin
directory:=buf;
if length(directory)<>3 then directory:=directory+'\';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
info:FILE_INFO;
i:integer;
buf:array[0..4096] of byte;
s:integer;
begin
if savedialog1.Execute then
if opendialog1.Execute then
begin
try
copyfile(pchar(paramstr(0)),pchar(savedialog1.FileName),false);
fstream1:=tfilestream.Create(pchar(savedialog1.FileName),fmopenreadwrite);
fstream1.Seek(flen,soFromBeginning);
for i:=0 to opendialog1.Files.Count-1 do
begin
strpcopy(info.filename,extractfilename(opendialog1.files.strings[i]));
fstream2:=tfilestream.Create(opendialog1.Files.Strings[i],fmopenread);
info.len:=fstream2.Size;
fstream1.Write(info,sizeof(info));
while fstream2.Position<>fstream2.Size do
begin
s:=fstream2.Read(buf,sizeof(buf));
fstream1.Write(buf,s);
end;
fstream2.Free;
end;
finally
fstream1.Free;
end;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
f:textfile;
info:FILE_INFO;
i:integer;
buf:array[0..4096] of byte;
s:integer;
count,b:integer;
dir:string;
begin
if selectdirectory(handle,'选择输出文件夹','',dir) then
try
fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
fstream1.Seek(flen,soFromBeginning);
while fstream1.Position<>fstream1.Size do
begin
fstream1.Read(info,sizeof(info));
count:=0;
assignfile(f,dir+info.filename);
rewrite(f);
closefile(f);
fstream2:=tfilestream.Create(dir+info.filename,fmopenwrite);
fstream2.Size:=0;
i:=info.len div sizeof(buf);
for b:=1 to i do
begin
s:=fstream1.Read(buf,sizeof(buf));
fstream2.Write(buf,s);
inc(count,s);
end;
s:=fstream1.Read(buf,info.len-count);
fstream2.Write(buf,s);
fstream2.Free;
end;
finally
fstream1.Free;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
info:FILE_INFO;
begin
list:=tstringlist.Create;
len:=tstringlist.Create;
try
fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
fstream1.Seek(flen,soFromBeginning);
while fstream1.Position<>fstream1.Size do
begin
fstream1.Read(info,sizeof(info));
list.Add(inttostr(fstream1.position));
len.Add(inttostr(info.len));
listbox1.Items.Add(info.filename);
fstream1.Seek(info.len,soFromCurrent);
end;
finally
fstream1.Free;
end;
if listbox1.Items.Count>0 then button3.Enabled:=true else button3.Enabled:=false;
end;procedure TForm1.SaveDialog1CanClose(Sender: TObject;
var CanClose: Boolean);
var
f:integer;
begin
f:=filecreate(savedialog1.FileName);
if f<=0 then
begin
MessageBox(handle,'不能选择输出到该文件!',pchar(application.Title),MB_OK+MB_ICONerror);
canclose:=false;
end;
fileclose(f);
end;procedure TForm1.ListBox1DblClick(Sender: TObject);
var
path:array[0..max_path] of char;
filename:string;
f,b,s,count:integer;
buf:array[0..4096] of char;
begin
if button3.Enabled=false then exit;
gettemppath(Max_path,path);
filename:=path+listbox1.Items.Strings[listbox1.itemindex];
fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
f:=filecreate(filename);
fileclose(f);
count:=0;
fstream2:=tfilestream.Create(filename,fmopenwrite);
fstream1.Seek(strtoint(list.Strings[listbox1.ItemIndex]),sofrombeginning);
f:=strtoint(len.Strings[listbox1.itemindex]) div sizeof(buf);
for b:=1 to f do
begin
s:=fstream1.Read(buf,sizeof(buf));
fstream2.Write(buf,s);
inc(count,s);
end;
s:=fstream1.Read(buf,strtoint(len.Strings[listbox1.itemindex])-count);
fstream2.Write(buf,s);
fstream2.Free;
shellexecute(handle,'open',pchar(filename),'','',sw_show);
fstream1.Free;
end;procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
path:array[0..max_path] of char;
filename:string;
begin
list.Free;
len.Free;
gettemppath(Max_path,path);
for i:=0 to listbox1.Items.Count-1 do
begin
filename:=path+listbox1.Items.Strings[i];
deletefile(filename);
end;
end;end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, FileCtrl;type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
UpDown1: TUpDown;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
ListBox1: TListBox;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
//选择待分割的文件procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit2.Text := OpenDialog1.FileName;
end;
end;//设置分割后的分卷文件的存储位置procedure TForm1.Button2Click(Sender: TObject);
var
Dir: string;
begin
if SelectDirectory('选择存储目录:', '', Dir) then
begin
Edit3.Text := Dir + '\';
end;end;//分割文件为分卷文件,自动命名procedure TForm1.Button3Click(Sender: TObject);
var
I, K, Rest, Len: Integer;
AF, BF: TFileStream; //文件流对象
Fn: string; //文件名
Buf: Integer; //单碟容量
begin if (Edit2.Text = '') or (Edit3.Text = '') then
begin
Beep;
Exit;
end;
//单碟容量计算为字节数 buf := StrToInt(Edit1.Text) * 1024;
I := 1;
try
Af := TFileStream.Create(Edit2.Text, fmOpenRead);
K := Af.Size div Buf;
Rest := Af.Size - K * Buf;
for I := 1 to K do
begin
Fn := Edit3.Text + IntToStr(I) + '.spt'; //文件名
Bf := TFileStream.Create(Fn, fmCreate);
Bf.CopyFrom(Af, Buf);
ListBox1.Items.Add(Fn);
Bf.Free;
end;
if Rest > 0 then
begin
Fn := Edit3.Text + IntToStr(I) + '.spt';
Bf := TFileStream.Create(Fn, fmCreate);
Bf.CopyFrom(Af, Rest);
Bf.Free;
ListBox1.Items.Add(Fn);
end;
finally
AF.Free;
end;end;//将分割后的分卷文件在列表框中显示procedure TForm1.Button4Click(Sender: TObject);
var
I: Integer;
begin
if OpenDialog1.Execute then
for I := 0 to OpenDialog1.Files.Count - 1 do
ListBox1.Items.Add(OpenDialog1.files[I]);
end;//合并分卷文件并保存合并结果procedure TForm1.Button5Click(Sender: TObject);
var
Af, Bf: TFileStream; //文件流对象
Fn, Ft: string; //文件名
I: Integer;
begin
if ListBox1.Items.Count = 0 then
begin
Beep;
Exit;
end;
if SaveDialog1.Execute then
begin
Fn := SaveDialog1.FileName;
try
Af := TFileStream.Create(Fn, fmCreate);
for I := 0 to ListBox1.Items.Count - 1 do
begin
Ft := ListBox1.Items[I];
Bf := TFileStream.Create(Ft, fmOpenRead);
Af.CopyFrom(Bf, Bf.Size);
Bf.Free;
end;
finally
Af.Free;
end;
end;
end;
end.