mainunit.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:5k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit mainunit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, Buttons,ShellApi,FileCtrl;
  6. type
  7.   TForm1 = class(TForm)
  8.     Memo1: TMemo;
  9.     Label2: TLabel;
  10.     BitBtn1: TBitBtn;
  11.     Edit1: TEdit;
  12.     BitBtn2: TBitBtn;
  13.     BitBtn3: TBitBtn;
  14.     Label1: TLabel;
  15.     BitBtn4: TBitBtn;
  16.     Edit2: TEdit;
  17.     procedure BitBtn1Click(Sender: TObject);
  18.     procedure BitBtn4Click(Sender: TObject);
  19.     procedure Edit1Change(Sender: TObject);
  20.     procedure Edit2Change(Sender: TObject);
  21.     procedure BitBtn2Click(Sender: TObject);
  22.     procedure FormCreate(Sender: TObject);
  23.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  24.     procedure BitBtn3Click(Sender: TObject);
  25.   private
  26.     { Private declarations }
  27.   public
  28.     function CurrentIsValidDir(SearchRec:TSearchRec):integer;
  29.     procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
  30.     procedure Xcopy(SourceDir,TargetDir:String);
  31.     { Public declarations }
  32.   end;
  33. var
  34.   Form1: TForm1;
  35.   TotalFileNumbers:Integer;
  36.   SearchFileType:String;
  37.   Copying:Boolean;
  38. implementation
  39. {$R *.dfm}
  40. function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer;
  41. begin
  42. if ((SearchRec.Attr <> 16) and
  43.     (SearchRec.Name<>'.')  and
  44.     (SearchRec.Name<>'..')) then
  45.   Result:=0
  46.   else if ((SearchRec.Attr = 16) and
  47.            (SearchRec.Name<>'.') and
  48.            (SearchRec.Name<>'..')) then
  49.   Result:=1
  50.   else
  51.   Result:=2;
  52. end;
  53. Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
  54. var
  55.  i:integer;
  56.  Subdir:TStringList;
  57.  SearchRec:TsearchRec;
  58. begin
  59. //第一次调用FindFirst和FindNext查找符合要求的文件
  60.  if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then
  61.   begin
  62.    repeat
  63.     if CurrentIsValidDir(SearchRec)=0 then
  64.       begin
  65.        Inc(Number);
  66.        Searchresult.Add(CurrentDir+SearchRec.Name);
  67.       end;
  68.     application.ProcessMessages ;
  69.    until (FindNext(SearchRec) <> 0);
  70.   end;
  71.  FindClose(SearchRec);
  72. //以下是递归部分,查找各子目录。
  73.  Subdir:=TStringList.Create;
  74.  if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
  75.   begin
  76.    repeat
  77.     if CurrentIsValidDir(SearchRec)=1 then
  78.      begin
  79.       Subdir.Add(SearchRec.Name);
  80.      end;
  81.     application.ProcessMessages ;
  82.    until (FindNext(SearchRec) <> 0);
  83.   end;
  84.  FindClose(SearchRec);
  85.  for i:=0 to Subdir.Count-1 do
  86.   begin
  87.    RecurSearchfile(CurrentDir+Subdir.Strings[i]+'',SearchFileType,Searchresult,Number);
  88.   end;
  89. //资源释放并返回结果。
  90.  Subdir.Free;
  91. end;
  92. procedure TForm1.Xcopy(SourceDir,TargetDir:String);
  93. var
  94.  OpStruc: TSHFileOpStruct;//声明一个TSHFileOpStruct记录结构
  95.  FromBuf, ToBuf: Array [0..128] of Char;//定义源和目的缓冲区
  96. begin
  97.  FillChar(FromBuf, Sizeof(FromBuf), 0 );
  98.  FillChar(ToBuf, Sizeof(ToBuf), 0 );
  99.  StrPCopy(FromBuf, SourceDir+'*.*' );
  100.  StrPCopy(ToBuf, TargetDir);
  101.  With OpStruc do 
  102. begin
  103.    Wnd:= Handle;//设定句柄为当前Form窗体,因此对话框为系统对话框
  104.    wFunc:= FO_Copy;//操作类型为从源到目的地的拷贝操作
  105.    pFrom:= @FromBuf;
  106.    pTo:=@ ToBuf;
  107.    fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;//控制方式为无确认与命名冲突的组合
  108.    fAnyOperationsAborted:= False;
  109.    hNameMappings:= Nil;
  110.    lpszProgressTitle:= Nil;
  111.   end;
  112.  ShFileOperation( OpStruc );//调用Api函数,传入参数完成操作
  113. end;
  114. procedure TForm1.BitBtn1Click(Sender: TObject);
  115. var
  116.  SelectDir:string;
  117. begin
  118.  if SelectDirectory(SelectDir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then
  119.   begin
  120.    if length(SelectDir) > 3 then
  121.     SelectDir:=SelectDir+'';
  122.    Edit1.Text:=SelectDir;
  123.   end;
  124. end;
  125. procedure TForm1.BitBtn4Click(Sender: TObject);
  126. var
  127.  SelectDir:string;
  128. begin
  129.  if SelectDirectory(SelectDir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then
  130.   begin
  131.    if length(SelectDir) > 3 then
  132.     SelectDir:=SelectDir+'';
  133.    Edit2.Text:=SelectDir;
  134.   end;
  135. end;
  136. procedure TForm1.Edit1Change(Sender: TObject);
  137. begin
  138.  if ((Edit1.Text='')or(Edit2.Text='')) then
  139.   BitBtn2.Enabled:=False
  140.  else
  141.   BitBtn2.Enabled:=True; 
  142. end;
  143. procedure TForm1.Edit2Change(Sender: TObject);
  144. begin
  145.  if ((Edit1.Text='')or(Edit2.Text='')) then
  146.   BitBtn2.Enabled:=False
  147.  else
  148.   BitBtn2.Enabled:=True;
  149. end;
  150. procedure TForm1.BitBtn2Click(Sender: TObject);
  151. begin
  152.  BitBtn2.Enabled:=False;
  153.  Copying:=True;
  154.  memo1.lines.Clear ;
  155.  TotalFileNumbers:=0;
  156.  RecurSearchFile(Edit1.Text,SearchFileType,memo1.lines, TotalFileNumbers);
  157.  Xcopy(Edit1.Text,Edit2.Text);
  158.  Copying:=False; 
  159.  Memo1.Lines.Add('拷贝操作全部结束,一共拷贝'+IntToStr(TotalFileNumbers)+'个文件到目标目录.');
  160.  Edit1.Clear;
  161.  Edit2.Clear;
  162. end;
  163. procedure TForm1.FormCreate(Sender: TObject);
  164. begin
  165.  TotalFileNumbers:=0;
  166.  SearchFileType:='*.*';
  167.  Copying:=False;
  168. end;
  169. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  170. begin
  171.  if Copying then
  172.   CanClose:=False
  173.  else
  174.   CanClose:=True;
  175. end;
  176. procedure TForm1.BitBtn3Click(Sender: TObject);
  177. begin
  178.  Close;
  179. end;
  180. end.