function IsFileInUse(fName : string ):boolean; //检测文件是否正在使用
var
HFileRes : HFILE;
begin
Result := false;
if not FileExists(fName) then
exit;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;
procedure TDownForm.DownLoadDir(LocalPath,ServerPath:string);
var
i,count1:integer;
att:TIdDirItemType;
FileList : TStrings;
Name{, Line}: String;
ss:string;
begin
try begin
FileList := TStringList.Create;
ChageDir(serverpath);
Application.ProcessMessages;
if AnsiLastChar(serverpath) <> '/' then
serverpath := serverpath + '/';
if AnsiLastChar(localpath) <> '\' then
localpath := localpath + '\';
if not DirectoryExists(localpath+serverpath) then ForceDirectories(localpath+serverpath);
IdFTP1.List(FileList);
Application.ProcessMessages;
count1:=IdFTP1.DirectoryListing.Count;
for i:=0 to count1-1 do begin
ss:=IdFTP1.DirectoryListing.Items[i].FileName;
att:=IdFTP1.DirectoryListing.Items[i].ItemType;
if (att<>ditDirectory) then begin
if not DirectoryExists(localpath+serverpath) then ForceDirectories(localpath+serverpath);
BytesToTransfer := IdFTP1.Size(ss);
if IsFileInUse(ss)=False then
IdFTP1.Get(ss,localpath+serverpath+ss,true)
else Exit;
Application.ProcessMessages;
lbl1.Caption:='已下载:'+ss;
lbl1.Update;
end
end;
for i:=0 to count1-1 do begin
ss:=IdFTP1.DirectoryListing.Items[i].FileName;
att:=IdFTP1.DirectoryListing.Items[i].ItemType;
BytesToTransfer := IdFTP1.Size(ss);
if (att=ditDirectory) and (ss <> '.') AND (ss <> '..') then begin
Name := ss;
if not DirectoryExists(localpath+serverpath+Name) then ForceDirectories(localpath+serverpath+Name);
DownLoadDir(localpath+serverpath,Name);
Application.ProcessMessages
end;
end;
ChageDir('..');//这句是返回前一个目录,写的另一个函数,可以用IdFTP1.ChangeDir替换
Filelist.Free;
end
except
end;
end;
procedure Tf_yrdwfileinfo.FTP_DownloadDir(remote_dir,local_dir:string); //下载整个目录,并遍历所有子目录 使用clftp
var
i,j,count1:integer;
att,ss:string;
current_dir,remote_dir2,currfile:string;
temp_dir,ftpdir:string;
F:textfile;
diratt:string;
filei:TFtpFileInfo;
lst : TStringList;
begin
ftpdir:=FtpClient1.HostDirName;
remote_dir2:=ftpdir+'/'+remote_dir;
FtpClient1.HostDirName :=remote_dir2;
//==========刷新目录
ftprefurbish(False );
//==========
current_dir:=remote_dir2; //主目录
temp_dir :=remote_dir ;
if not DirectoryExists(local_dir) then CreateDir(local_dir);
if not directoryexists(local_dir+'\'+temp_dir) then createdir(local_dir+'\'+temp_dir);
lst := TStringList.Create;
lst.LoadFromFile(TEMP_FILE_NAME);
for i :=2 to lst.Count - 1 do
begin
diratt:=lst[i];
filei:=GetFileInfo(diratt);
if (copy(filei.Attrib ,1,1)<>'d') then
begin
//if not DirectoryExists(local_dir) then CreateDir(local_dir); //创退本地目录
//==========下载文件
ftpclient1.Pwd ;
currfile:=ftpclient1.DirResult ;
currfile:=currfile+'/'+filei.FileName ;
ftpclient1.HostFileName :=currfile;
Ftpclient1.Binary :=true;
FtpClient1.TypeSet ;
ftpclient1.LocalFileName :=local_dir+'\'+temp_dir+'\'+filei.FileName ;
ftpclient1.Get ;
Ftpclient1.Binary :=false;
FtpClient1.TypeSet ;
//==========
end
else
begin
if not (filei.Filename ='..') then
begin
FTP_DownloadDir(filei.FileName,local_dir+'\'+remote_dir);
end;
end;
end;
lst.Free ;
end;