一、 文件切割/組合原理
所謂文件切割,就是把一個文件切割成若干個小文件。做法就是將一個文件對象以"文件流"的方式讀出,然后按照一定的塊(Block)大小分別存成文件。文件組合,就是把若干個文件組合成一個文件。比如像打包工具(Wise)用到的就是這個原理。如果大家對"流"這個概念熟悉的話,那么實現(xiàn)起來就很容易了,以下就是實現(xiàn)步驟。
二、 實現(xiàn)
在Delphi中新建一個工程,然后在窗體中加入兩個BUTTON,一個EDIT,一個OPENDIALOG,一個SAVEDIALOG,再將BUTTON1的CAPTION改為"切割",BUTTON2的CAPTION改為"組合"(注:其它控件的屬性略)。再雙擊BUTTON1和BUTTON2,寫下如下代碼:
//切割文件
procedure TForm1.Button1Click(Sender: TObject);
var
i, WantedFragSize, RealToWrite : Integer;
//聲明兩個文件流對象
//InStream為輸入源文件流對象,OutStream為輸出切割文件流對象
InStream, OutStream : TFileStream;
S : String;
begin
if Opendialog1.Execute then
begin
SaveDialog1.Title := '輸入你要保存的切割文件名';
If SaveDialog1.Execute then
begin
WantedFragSize := StrtoInt(Edit1.Text); //定義切割塊大小
i := 0;
//以只讀的方式創(chuàng)建一個輸入文件流對象
InStream:=TFileStream.Create(
OpenDialog1.FileName,fmOpenRead);
Try
//如果Instream流的當(dāng)前指針位置不在末尾,就按照定義的塊大小//來讀出數(shù)據(jù)并存成文件
while (InStream.Position < InStream.Size) do
Begin
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
//生成切割文件的擴(kuò)展名,用三位數(shù)字來作為擴(kuò)展名,方便組合文件
//如果InStream所剩的塊大小小于定義的塊大小,則將剩下的塊數(shù)//據(jù)存成文件
If InStream.Size - InStream.Position < WantedFragSize then
RealToWrite := InStream.Size - InStream.Position
else
RealToWrite := WantedFragSize;
//創(chuàng)建一個輸出文件流對象
OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
try
OutStream.CopyFrom(InStream,RealToWrite);
Inc(i);
Finally
//釋放輸出文件流對象
OutStream.Free;
end;
end;
Finally
InStream.Free;
end;
end;
end;
end;
//組合文件
procedure TForm1.Button2Click(Sender: TObject);
var
i : Integer;
InStream, OutStream : TFileStream;
SourcePath, FragName, S : String;
begin
Opendialog1.Title := '請選擇切割文件';
if Opendialog1.Execute then
begin
//得到當(dāng)前打開的切割文件的路徑
SourcePath := ExtractFilePath(Opendialog1.FileName);
//得到當(dāng)前打開的切割文件的文件名
FragName := ExtractFileName(Opendialog1.FileName);
SaveDialog1.Title := '請輸入你要組合的文件名';
If SaveDialog1.Execute then
begin
i := 0;
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
FragName := ChangeFileExt(FragName, s);
//如果目錄中有以.000為擴(kuò)展名的文件存在,則創(chuàng)建一個輸出文件流//對象
If FileExists(SourcePath+FragName) then
begin
OutStream:=TFileStream.Create(Savedialog1.FileName,fmCreate);
Try
//按照以文件擴(kuò)展名遞增的方式組合文件
While FileExists(SourcePath+FragName) do
Begin
InStream:=TFileStream.Create(SourcePath+FragName,fmOpenRead);
Try
//將輸入文件流的數(shù)據(jù)寫入到輸出文件流中
OutStream.CopyFrom(InStream,0);
Inc(i);
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
FragName := ChangeFileExt(FragName, s);
finally
InStream.Free;
end;
end;
finally
OutStream.Free;
end;
end;
end;
end;
end;
{*注釋:請注意COPYFROM方法的使用,當(dāng)?shù)诙€參數(shù)為0時,表示將輸入流InStream的數(shù)據(jù)全部寫入輸出流OutStream;當(dāng)大于0為N時,表示從輸入流InStream的當(dāng)前流指針位置開始,將N個字節(jié)數(shù)據(jù)寫入輸出流OutStream,并且InStream的流指針會向后偏移N個字節(jié)位數(shù)。詳細(xì)解釋請查看DELPHI自帶的幫助*}
三、結(jié)束語
在我們用到的很多日常工具中,有很多都會用到的"流"這個對象,它的作用也非常大,例如文件加密,文件下載等都會涉及到"流",所以筆者認(rèn)為,掌握它是很有用的,也是比較重要的。
所謂文件切割,就是把一個文件切割成若干個小文件。做法就是將一個文件對象以"文件流"的方式讀出,然后按照一定的塊(Block)大小分別存成文件。文件組合,就是把若干個文件組合成一個文件。比如像打包工具(Wise)用到的就是這個原理。如果大家對"流"這個概念熟悉的話,那么實現(xiàn)起來就很容易了,以下就是實現(xiàn)步驟。
二、 實現(xiàn)
在Delphi中新建一個工程,然后在窗體中加入兩個BUTTON,一個EDIT,一個OPENDIALOG,一個SAVEDIALOG,再將BUTTON1的CAPTION改為"切割",BUTTON2的CAPTION改為"組合"(注:其它控件的屬性略)。再雙擊BUTTON1和BUTTON2,寫下如下代碼:
//切割文件
procedure TForm1.Button1Click(Sender: TObject);
var
i, WantedFragSize, RealToWrite : Integer;
//聲明兩個文件流對象
//InStream為輸入源文件流對象,OutStream為輸出切割文件流對象
InStream, OutStream : TFileStream;
S : String;
begin
if Opendialog1.Execute then
begin
SaveDialog1.Title := '輸入你要保存的切割文件名';
If SaveDialog1.Execute then
begin
WantedFragSize := StrtoInt(Edit1.Text); //定義切割塊大小
i := 0;
//以只讀的方式創(chuàng)建一個輸入文件流對象
InStream:=TFileStream.Create(
OpenDialog1.FileName,fmOpenRead);
Try
//如果Instream流的當(dāng)前指針位置不在末尾,就按照定義的塊大小//來讀出數(shù)據(jù)并存成文件
while (InStream.Position < InStream.Size) do
Begin
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
//生成切割文件的擴(kuò)展名,用三位數(shù)字來作為擴(kuò)展名,方便組合文件
//如果InStream所剩的塊大小小于定義的塊大小,則將剩下的塊數(shù)//據(jù)存成文件
If InStream.Size - InStream.Position < WantedFragSize then
RealToWrite := InStream.Size - InStream.Position
else
RealToWrite := WantedFragSize;
//創(chuàng)建一個輸出文件流對象
OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
try
OutStream.CopyFrom(InStream,RealToWrite);
Inc(i);
Finally
//釋放輸出文件流對象
OutStream.Free;
end;
end;
Finally
InStream.Free;
end;
end;
end;
end;
//組合文件
procedure TForm1.Button2Click(Sender: TObject);
var
i : Integer;
InStream, OutStream : TFileStream;
SourcePath, FragName, S : String;
begin
Opendialog1.Title := '請選擇切割文件';
if Opendialog1.Execute then
begin
//得到當(dāng)前打開的切割文件的路徑
SourcePath := ExtractFilePath(Opendialog1.FileName);
//得到當(dāng)前打開的切割文件的文件名
FragName := ExtractFileName(Opendialog1.FileName);
SaveDialog1.Title := '請輸入你要組合的文件名';
If SaveDialog1.Execute then
begin
i := 0;
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
FragName := ChangeFileExt(FragName, s);
//如果目錄中有以.000為擴(kuò)展名的文件存在,則創(chuàng)建一個輸出文件流//對象
If FileExists(SourcePath+FragName) then
begin
OutStream:=TFileStream.Create(Savedialog1.FileName,fmCreate);
Try
//按照以文件擴(kuò)展名遞增的方式組合文件
While FileExists(SourcePath+FragName) do
Begin
InStream:=TFileStream.Create(SourcePath+FragName,fmOpenRead);
Try
//將輸入文件流的數(shù)據(jù)寫入到輸出文件流中
OutStream.CopyFrom(InStream,0);
Inc(i);
s := IntToStr(I);
while Length(s) < 3 do s := '0'+s;
s := '.'+s;
FragName := ChangeFileExt(FragName, s);
finally
InStream.Free;
end;
end;
finally
OutStream.Free;
end;
end;
end;
end;
end;
{*注釋:請注意COPYFROM方法的使用,當(dāng)?shù)诙€參數(shù)為0時,表示將輸入流InStream的數(shù)據(jù)全部寫入輸出流OutStream;當(dāng)大于0為N時,表示從輸入流InStream的當(dāng)前流指針位置開始,將N個字節(jié)數(shù)據(jù)寫入輸出流OutStream,并且InStream的流指針會向后偏移N個字節(jié)位數(shù)。詳細(xì)解釋請查看DELPHI自帶的幫助*}
三、結(jié)束語
在我們用到的很多日常工具中,有很多都會用到的"流"這個對象,它的作用也非常大,例如文件加密,文件下載等都會涉及到"流",所以筆者認(rèn)為,掌握它是很有用的,也是比較重要的。