ftpads 是 被复制的目录
如 Restore('D:\123\','E:\123') 就是把D:\123\ 复制到 E:\123\
我的要求是 完全复制完毕 函数为True ,中途停止(有个按钮)函数为False
因为子目录的复制用了循环,我不知道应该把Result写哪,我怎么才能知道他完全复制完毕了?
小弟刚学Delphi 代码是网上找来,再自己修改的,有不合理的地方还希望大侠们帮小弟改过来,谢谢function TForm1.Restore(ftpads, copyads: string): Boolean;
var
sr:TSearchRec;
FromFile, ToFile: TFileStream;
PackSize, CurrentSize: integer;
SubDirectory: TStringList;
i: integer;begin
if Restoring=true then
begin
if FindFirst(ftpads + '*.*', faAnyFile, sr) = 0 then
begin
repeat
if ((sr.Attr and faDirectory)<>16) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
begin
StatusBar1.Panels[0].Text:=copyads + sr.Name;
Memo1.Lines.Add('Download: ' + copyads + sr.Name);
PackSize:= 4096;
ProgressBar1.Max := sr.Size div PackSize;
FromFile := TFileStream.Create(ftpads + sr.Name, fmOpenRead);
try
ToFile := TFileStream.Create(copyads + sr.Name, fmCreate);
try
CurrentSize := 0;
repeat
if sr.Size - CurrentSize <= PackSize then
PackSize := sr.Size - CurrentSize;
ToFile.CopyFrom(FromFile, PackSize);
Inc(CurrentSize, PackSize);
ProgressBar1.Position := ProgressBar1.Position + 1;
until CurrentSize >= sr.Size;
GetFileTime(FromFile.Handle, @CreateFT, @LastAccessFT, @LastWriteFT);
SetFileTime(ToFile.Handle, @CreateFT, @LastAccessFT, @sr.FindData.ftLastWriteTime);
finally
ToFile.Free;
end
finally
FromFile.Free;
end;
end;
Application.ProcessMessages;
until (FindNext(sr) <> 0);
FindClose(sr);
end; //=============遍历子目录部分==============//
SubDirectory:= TStringList.Create;
try
if (FindFirst(ftpads + '*.*', faAnyFile, sr) = 0) then
begin
repeat
if ((sr.Attr and faDirectory)=16) and ((sr.Attr and SysUtils.faSysFile)<>4) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
begin
SubDirectory.Add(sr.Name);
if not DirectoryExists(copyads+sr.Name+'\') then
ForceDirectories(copyads+sr.Name+'\');
end;
Application.ProcessMessages;
until FindNext(sr)<>0;
FindClose(sr);
end;
for i:=0 to SubDirectory.Count-1 do
begin
if Restore(ftpads + SubDirectory.Strings[i] + '\', copyads + SubDirectory.Strings[i] + '\') = false then
break;
end;
finally
SubDirectory.Free;
end;
end else//========Restoring=false 中途停止
begin end;// Result:= True;
// memo1.Lines.Add('修复完毕');
// Restoring:= False;
end;
如 Restore('D:\123\','E:\123') 就是把D:\123\ 复制到 E:\123\
我的要求是 完全复制完毕 函数为True ,中途停止(有个按钮)函数为False
因为子目录的复制用了循环,我不知道应该把Result写哪,我怎么才能知道他完全复制完毕了?
小弟刚学Delphi 代码是网上找来,再自己修改的,有不合理的地方还希望大侠们帮小弟改过来,谢谢function TForm1.Restore(ftpads, copyads: string): Boolean;
var
sr:TSearchRec;
FromFile, ToFile: TFileStream;
PackSize, CurrentSize: integer;
SubDirectory: TStringList;
i: integer;begin
if Restoring=true then
begin
if FindFirst(ftpads + '*.*', faAnyFile, sr) = 0 then
begin
repeat
if ((sr.Attr and faDirectory)<>16) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
begin
StatusBar1.Panels[0].Text:=copyads + sr.Name;
Memo1.Lines.Add('Download: ' + copyads + sr.Name);
PackSize:= 4096;
ProgressBar1.Max := sr.Size div PackSize;
FromFile := TFileStream.Create(ftpads + sr.Name, fmOpenRead);
try
ToFile := TFileStream.Create(copyads + sr.Name, fmCreate);
try
CurrentSize := 0;
repeat
if sr.Size - CurrentSize <= PackSize then
PackSize := sr.Size - CurrentSize;
ToFile.CopyFrom(FromFile, PackSize);
Inc(CurrentSize, PackSize);
ProgressBar1.Position := ProgressBar1.Position + 1;
until CurrentSize >= sr.Size;
GetFileTime(FromFile.Handle, @CreateFT, @LastAccessFT, @LastWriteFT);
SetFileTime(ToFile.Handle, @CreateFT, @LastAccessFT, @sr.FindData.ftLastWriteTime);
finally
ToFile.Free;
end
finally
FromFile.Free;
end;
end;
Application.ProcessMessages;
until (FindNext(sr) <> 0);
FindClose(sr);
end; //=============遍历子目录部分==============//
SubDirectory:= TStringList.Create;
try
if (FindFirst(ftpads + '*.*', faAnyFile, sr) = 0) then
begin
repeat
if ((sr.Attr and faDirectory)=16) and ((sr.Attr and SysUtils.faSysFile)<>4) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
begin
SubDirectory.Add(sr.Name);
if not DirectoryExists(copyads+sr.Name+'\') then
ForceDirectories(copyads+sr.Name+'\');
end;
Application.ProcessMessages;
until FindNext(sr)<>0;
FindClose(sr);
end;
for i:=0 to SubDirectory.Count-1 do
begin
if Restore(ftpads + SubDirectory.Strings[i] + '\', copyads + SubDirectory.Strings[i] + '\') = false then
break;
end;
finally
SubDirectory.Free;
end;
end else//========Restoring=false 中途停止
begin end;// Result:= True;
// memo1.Lines.Add('修复完毕');
// Restoring:= False;
end;
GetFileTime(FromFile.Handle, @CreateFT, @LastAccessFT, @LastWriteFT);
SetFileTime(ToFile.Handle, @CreateFT, @LastAccessFT, @sr.FindData.ftLastWriteTime);
要去掉,呵呵
var
sr: TSearchRec;
begin
if( FindFirst( ASrcDir + '*.*', faAnyFile, sr ) = 0 ) then
begin
Repeat
if( sr.Name <> '.' ) and (sr.Name <> '..' ) then
begin
if( sr.Attr and faDirectory ) > 0 then
begin
//如果是目录,则在目录路径中创建相同的目录,递归s
mkdir( ATrgDir + sr.Name ); CopyTree( ASrcDir + sr.Name + '\', ATrgDir + sr.Name + '\' );
end
else begin
CopyFile( PChar(ASrcDir + sr.Name), PChar(ATrgDir + sr.Name), False );
end;
end;
until( FindNext(sr) <> 0 );
end;
SysUtils.FindClose( sr );
end;
procedure RestoreDir(FromDir, ToDir: string);
var
sr: TSearchRec;
Er: Integer;
begin
Er := FindFirst(ToDir + '\' + '*.*', faAnyFile, sr);
while Er = 0 do
begin
if Restoring then
begin
if (sr.Name[1] <> '.') and ((sr.Attr and SysUtils.faSysFile) <> 4) then
begin
if (not DirectoryExists(FromDir + '\' + sr.Name)) and
(not FileExists(FromDir + '\' + sr.Name)) then
begin
if DelPath(self.Handle, ToDir + '\' + sr.Name) then
memo1.Lines.Add('删除成功-->' + ToDir + '\' + sr.Name)
else
memo1.Lines.Add('删除失败-->' + ToDir + '\' + sr.Name)
end;
end;
Er := FindNext(sr);
end
else
Break;
end; Er := FindFirst(FromDir + '\' + '*.*', faAnyFile, sr);
while Er = 0 do
begin
if Restoring then
begin
if (sr.Name[1] <> '.') then
begin
//找到文件
if (sr.Attr and faDirectory) = 0 then
begin
StatusBar1.Panels[0].Text := ToDir + '\' + sr.Name;
if CompareFile(sr, ToDir + '\' + sr.Name) then
Memo1.Lines.Add('Check: ' + ToDir + '\' + sr.Name)
else
begin
if CopyFile(FromDir + '\' + sr.Name, ToDir + '\' + sr.Name) then
Memo1.Lines.Add('复制成功-->' + ToDir + '\' + sr.Name)
else
Memo1.Lines.Add('复制失败-->' + ToDir + '\' + sr.Name);
end;
end
else //找到子目录
if ((sr.Attr and faDirectory) = 16) then
begin
ChDir(FromDir + '\' + sr.Name);
RestoreDir(FromDir + '\' + sr.Name, ToDir + '\' + sr.Name);
ChDir('..');
end;
end;
Er := FindNext(sr);
Application.ProcessMessages;
end
else
Break;
end;
FindClose(sr);
end;
begin
Memo1.Lines.Clear;
RestoreDir(FromPath, ToPath);
if Restoring = true then
begin
Result := true;
Memo1.Lines.Add(Topath + ' 修复完毕!');
end
else
begin
Result := false;
Memo1.Lines.Add('修复 ' + ToPath + ' 时被终止!');
end;
ProgressBar1.Position := 0;
StatusBar1.Panels[0].Text := '';
end;procedure TMainForm.bsSkinButton1Click(Sender: TObject);
begin
if bsSkinButton1.Caption = '修 复' then
begin
bsSkinButton1.Caption := '停止修复';
Restoring := true;
end;
if bsSkinButton1.Caption = '停止修复' then
begin
Restoring := false;
bsSkinButton1.Caption := '修 复';
end;
end;