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 下测试通过  
各位大哥指点下 我要注意点什么 哪里做的不好的 谢谢了

解决方案 »

  1.   

    FORM1有几个过程声明忘记删除了 - -!!
      

  2.   

    TrueFileName: string[255] 可直接声明为TFileName
        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来处理),便于扩展