unit CutMergerFile;interface
uses
SysUtils, Classes, Key, IniFiles, Md5;
type //KEY为DES加密算法
TCutFile = class(TObject)//文件分割类
private
AllSize: Int64; //文件大小
CurrentItem: Integer;//分割进度
Mode: string;//按照大小还是数量分割
public
TargetDir: string;//目的目录
FilePath: string;//被分割文件路径
FileCount: Integer;//分割数量
FileExt: string[255];//分割后的扩展名
FileSize: Int64;//分割后每个文件大小
TrueFileName: string[255];//分割后的文件名(不包括扩展名)
function Work:boolean;//执行分割
procedure SetMode(Value: integer);//设置分割方式
function GetAllSize: Int64;
function GetCurrentItem: Integer;
constructor Create(AFilePath:String);
end;
TMergerFile = class(TObject) //文件合并类
private
CurrentItem: integer;
FileMd5: string;
FileName: string;
FileCount: Integer;
TrueFileName: string[255];
public
Dir: string;
FileExt: string[255];
function Work: boolean;
function Test: boolean;//获取合并信息 并检测是否可以合并
function GetCurrentItem: integer;
constructor Create(ADir, AFileName: string);
end;
function AddD(s: string): string;
implementationuses Math;function AddD(s: string): string;
begin
if copy(s, length(s), 1) <> '\' then
Result := s + '\'
else
Result := s;end;function Isint(s: string): boolean;//判断是否为数字
var
ss: string;
i: integer;
begin
ss := s;
Result := true;
if ss <> '' then
begin
for i := 0 to length(ss) - 1 do
begin
if not (ss[i + 1] in ['0'..'9']) then
begin
Result := false;
Exit;
end;
end;
end;
end;constructor TCutFile.Create(AFilePath:string);
begin
inherited Create;
Mode := 'Count';
FileExt := '.bei';
FilePath:=AFilePath;
end;function TCutFile.GetAllSize: Int64;
var
Afile: TFileStream;
begin
Afile := TFileStream.Create(FilePath, fmShareDenyNone);
Result := Afile.Size;
AllSize := Afile.Size;
Afile.Free;
end;function TCutFile.GetCurrentItem: integer;
begin
Result := CurrentItem;
end;procedure TCutFile.SetMode(Value: integer);
begin
if Value = 0 then
Mode := 'Count';
if Value = 1 then
Mode := 'Size';
end;function TCutFile.Work:boolean;
var
File1: TFileStream;
File2: TFileStream;
File3: TIniFile;
i: integer;
begin
Result:=true;
try
GetAllSize;
TargetDir := AddD(TargetDir);
File3 := TIniFile.Create(TargetDir + TrueFileName + FileExt);
file3.WriteString('Info', 'FileName', EncryStrHex(ExtractFileName(FilePath), 'xiongya'));
file3.WriteString('Info', 'Md5', MD5Print(MD5File(FilePath)));
File1 := TFileStream.Create(FilePath, fmOpenRead, fmShareDenyNone);
if Mode = 'Count' then
FileSize := AllSize div FileCount
else
if Mode = 'Size' then
FileCount := AllSize div FileSize;
for i := 0 to FileCount - 1 do
begin
CurrentItem := i + 1;
File2 := TFileStream.Create(TargetDir + TrueFileName + FileExt + IntToStr(i), fmCreate);
File1.Seek(i * FileSize, soFromBeginning);
if (i <> FileCount - 1) then
File2.CopyFrom(File1, FileSize)
else
File2.CopyFrom(File1, (AllSize - ((FileCount - 1) * FileSize)));
File2.Free;
end;
file3.WriteString('Info', 'Count', IntToStr(FileCount));
File1.Free;
File3.Free;
Except
Result:=false;
end;
end;
//----------------------------------------------------------------------------------function TMergerFile.Test: boolean;
var
F: TIniFile;
var
i: integer;
begin
Result := true;
if FileExists(Dir + FileName + FileExt) = false then
begin
Result := false;
exit;
end
else
begin
f := TIniFile.Create(Dir + FileName + FileExt);
FileMd5 := f.ReadString('Info', 'Md5', '');
TrueFileName := DecryStrHex((f.ReadString('Info', 'FileName', '')), 'xiongya');
FileCount := StrToInt(f.ReadString('Info', 'Count', ''));
end;
for i := 0 to FileCount - 1 do
begin
if FileExists(Dir + FileName + FileExt + IntToStr(i)) = false then
begin
Result := false;
exit;
end;
end;
end;
constructor TMergerFile.Create(ADir, AFileName: string);
begin
inherited Create;
Dir := AddD(ADir);
FileName := AFileName;
FileExt := '.bei';
end;function TMergerFile.GetCurrentItem: integer;
begin
Result := CurrentItem;end;function TMergerFile.Work: boolean;
var
File1: TFileStream;
File2: TFileStream;
i: integer;
begin
Result := true;
try
File1 := TFileStream.Create(Dir + TrueFileName, fmCreate);
for i := 0 to FileCount - 1 do
begin
CurrentItem := i - 1;
File1.Seek(0, soFromEnd);
File2 := TFileStream.Create(Dir + FileName + FileExt + IntToStr(i), fmOpenRead, fmShareDenyNone);
File1.CopyFrom(File2, 0);
File2.Free;
end;
File1.Free;
except
Result := false;
end;
if MD5Print(MD5File(Dir + TrueFileName)) <> FileMd5 then //验证MD5
Result := false;
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, CutMergerFile;type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
RadioGroup1: TRadioGroup;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
Cut: TCutFile;
begin
try
Cut := TCutFile.Create('E:\PROJECT1.EXE');
cut.TargetDir := 'e:\';
cut.FileCount := 3;
cut.TrueFileName := '测试';
cut.Work;
finally
cut.Free;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
s: TMergerFile;
begin
try
s := TMergerFile.Create('e:', '测试');
if s.Test then
s.Work;
finally
s.Free;
End;
end;end.delphi7+Windows XP 下测试通过
各位大哥指点下 我要注意点什么 哪里做的不好的 谢谢了
uses
SysUtils, Classes, Key, IniFiles, Md5;
type //KEY为DES加密算法
TCutFile = class(TObject)//文件分割类
private
AllSize: Int64; //文件大小
CurrentItem: Integer;//分割进度
Mode: string;//按照大小还是数量分割
public
TargetDir: string;//目的目录
FilePath: string;//被分割文件路径
FileCount: Integer;//分割数量
FileExt: string[255];//分割后的扩展名
FileSize: Int64;//分割后每个文件大小
TrueFileName: string[255];//分割后的文件名(不包括扩展名)
function Work:boolean;//执行分割
procedure SetMode(Value: integer);//设置分割方式
function GetAllSize: Int64;
function GetCurrentItem: Integer;
constructor Create(AFilePath:String);
end;
TMergerFile = class(TObject) //文件合并类
private
CurrentItem: integer;
FileMd5: string;
FileName: string;
FileCount: Integer;
TrueFileName: string[255];
public
Dir: string;
FileExt: string[255];
function Work: boolean;
function Test: boolean;//获取合并信息 并检测是否可以合并
function GetCurrentItem: integer;
constructor Create(ADir, AFileName: string);
end;
function AddD(s: string): string;
implementationuses Math;function AddD(s: string): string;
begin
if copy(s, length(s), 1) <> '\' then
Result := s + '\'
else
Result := s;end;function Isint(s: string): boolean;//判断是否为数字
var
ss: string;
i: integer;
begin
ss := s;
Result := true;
if ss <> '' then
begin
for i := 0 to length(ss) - 1 do
begin
if not (ss[i + 1] in ['0'..'9']) then
begin
Result := false;
Exit;
end;
end;
end;
end;constructor TCutFile.Create(AFilePath:string);
begin
inherited Create;
Mode := 'Count';
FileExt := '.bei';
FilePath:=AFilePath;
end;function TCutFile.GetAllSize: Int64;
var
Afile: TFileStream;
begin
Afile := TFileStream.Create(FilePath, fmShareDenyNone);
Result := Afile.Size;
AllSize := Afile.Size;
Afile.Free;
end;function TCutFile.GetCurrentItem: integer;
begin
Result := CurrentItem;
end;procedure TCutFile.SetMode(Value: integer);
begin
if Value = 0 then
Mode := 'Count';
if Value = 1 then
Mode := 'Size';
end;function TCutFile.Work:boolean;
var
File1: TFileStream;
File2: TFileStream;
File3: TIniFile;
i: integer;
begin
Result:=true;
try
GetAllSize;
TargetDir := AddD(TargetDir);
File3 := TIniFile.Create(TargetDir + TrueFileName + FileExt);
file3.WriteString('Info', 'FileName', EncryStrHex(ExtractFileName(FilePath), 'xiongya'));
file3.WriteString('Info', 'Md5', MD5Print(MD5File(FilePath)));
File1 := TFileStream.Create(FilePath, fmOpenRead, fmShareDenyNone);
if Mode = 'Count' then
FileSize := AllSize div FileCount
else
if Mode = 'Size' then
FileCount := AllSize div FileSize;
for i := 0 to FileCount - 1 do
begin
CurrentItem := i + 1;
File2 := TFileStream.Create(TargetDir + TrueFileName + FileExt + IntToStr(i), fmCreate);
File1.Seek(i * FileSize, soFromBeginning);
if (i <> FileCount - 1) then
File2.CopyFrom(File1, FileSize)
else
File2.CopyFrom(File1, (AllSize - ((FileCount - 1) * FileSize)));
File2.Free;
end;
file3.WriteString('Info', 'Count', IntToStr(FileCount));
File1.Free;
File3.Free;
Except
Result:=false;
end;
end;
//----------------------------------------------------------------------------------function TMergerFile.Test: boolean;
var
F: TIniFile;
var
i: integer;
begin
Result := true;
if FileExists(Dir + FileName + FileExt) = false then
begin
Result := false;
exit;
end
else
begin
f := TIniFile.Create(Dir + FileName + FileExt);
FileMd5 := f.ReadString('Info', 'Md5', '');
TrueFileName := DecryStrHex((f.ReadString('Info', 'FileName', '')), 'xiongya');
FileCount := StrToInt(f.ReadString('Info', 'Count', ''));
end;
for i := 0 to FileCount - 1 do
begin
if FileExists(Dir + FileName + FileExt + IntToStr(i)) = false then
begin
Result := false;
exit;
end;
end;
end;
constructor TMergerFile.Create(ADir, AFileName: string);
begin
inherited Create;
Dir := AddD(ADir);
FileName := AFileName;
FileExt := '.bei';
end;function TMergerFile.GetCurrentItem: integer;
begin
Result := CurrentItem;end;function TMergerFile.Work: boolean;
var
File1: TFileStream;
File2: TFileStream;
i: integer;
begin
Result := true;
try
File1 := TFileStream.Create(Dir + TrueFileName, fmCreate);
for i := 0 to FileCount - 1 do
begin
CurrentItem := i - 1;
File1.Seek(0, soFromEnd);
File2 := TFileStream.Create(Dir + FileName + FileExt + IntToStr(i), fmOpenRead, fmShareDenyNone);
File1.CopyFrom(File2, 0);
File2.Free;
end;
File1.Free;
except
Result := false;
end;
if MD5Print(MD5File(Dir + TrueFileName)) <> FileMd5 then //验证MD5
Result := false;
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, CutMergerFile;type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
RadioGroup1: TRadioGroup;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
Cut: TCutFile;
begin
try
Cut := TCutFile.Create('E:\PROJECT1.EXE');
cut.TargetDir := 'e:\';
cut.FileCount := 3;
cut.TrueFileName := '测试';
cut.Work;
finally
cut.Free;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
s: TMergerFile;
begin
try
s := TMergerFile.Create('e:', '测试');
if s.Test then
s.Work;
finally
s.Free;
End;
end;end.delphi7+Windows XP 下测试通过
各位大哥指点下 我要注意点什么 哪里做的不好的 谢谢了
TargetDir: string;//目的目录
FilePath: string;//被分割文件路径
FileCount: Integer;//分割数量
FileExt: string[255];//分割后的扩展名
FileSize: Int64;//分割后每个文件大小
TrueFileName: string[255];//分割后的文件名(不包括扩展名)
可以放在private区
如果要开放可以使用property方式
类内私有变量命名F+变量名(Delphi默认约定,不强求)
procedure TCutFile.SetMode(Value: integer);
begin
if Value = 0 then
Mode := 'Count';
if Value = 1 then
Mode := 'Size';
end;
分割方式可以定义为枚举类型
type
TCutMode = (cmCount, cmSize);
定义
public
property CutMode: TCutMode read FCutMode write FCutMode default cmCount;Work分割方法抽象化(使用TStream来处理),便于扩展