当前位置:我的异常网» Delphi » 怎么获得FTP服务器上目录下的所有文件名和子目录
怎么获得FTP服务器上目录下的所有文件名和子目录
www.myexceptions.net 网友分享于:2015-08-26 浏览:560次
如何获得FTP服务器上目录下的所有文件名和子目录
我用的是indy 10 的tidftp控件,请问如何获得FTP服务器上目录下的所有文件名和子目录,先谢谢了
------解决方案--------------------
这是我做的FTP搜索工具中搜索线程的主要代码,还有不要使用tidftp,长时间搜索会出现死锁现象,使用WinInet单元
www.ftpff.com
procedure TFtpScan.Execute;
var
FFTPHandle: HINTERNET;
FInetHandle: HINTERNET;
Enum: HINTERNET;
FFindFileData: WIN32_FIND_DATA;
R: Boolean;
FFileName, DataStr: string;
TempErrorCode: Cardinal;
begin
Sleep(100);
Application.Initialize;
FInetHandle := InternetOpen(PChar(ThreadRecord.SiteName), 0, nil, nil, 0);
FFTPHandle := InternetConnect(FInetHandle, PChar(ThreadRecord.Host), ThreadRecord.Port, PChar(ThreadRecord.UserName), PChar(ThreadRecord.UserPassWord), INTERNET_SERVICE_FTP, 0, 255);
if (FFTPHandle = nil) and (not Terminated) then
begin //登陆服务器失败,关闭句柄,记录错误,重新连接
CloseFTPHandle(FInetHandle, FFTPHandle);
EnterCriticalSection(CS);
OnError( 'InternetConnect ', ' ', GetLastError);
LeaveCriticalSection(CS);
ReTryConnection(ThreadRecord);
Exit;
end;
while (ThreadRecord.FFTPDir.Count > 0) and (not Terminated) do
begin
if (FFTPHandle = nil) or (FInetHandle = nil) then
begin
CloseFTPHandle(FInetHandle, FFTPHandle);
EnterCriticalSection(CS);
OnError( 'Handle ', ' ', GetLastError);
LeaveCriticalSection(CS);
ReTryConnection(ThreadRecord);
Exit;
end;
if FtpSetCurrentDirectory(FFTPHandle, PChar(ThreadRecord.FFTPDir.Strings[0])) = False then
begin
EnterCriticalSection(CS);
OnError( 'FtpSetCurrentDirectory ', ThreadRecord.FFTPDir.Strings[0], GetLastError);
LeaveCriticalSection(CS);
ThreadRecord.FFTPDir.Delete(0);
CloseFTPHandle(FInetHandle, FFTPHandle);
ReTryConnection(ThreadRecord);
Exit;
end;
Enum := FtpFindFirstFile(FFTPHandle, PChar( '*.* '), FFindFileData, 0, 0);
if Enum = nil then
begin
TempErrorCode := GetLastError;
if TempErrorCode <> 18 then
begin
EnterCriticalSection(CS);
OnError( 'FtpFindFirstFile ', ThreadRecord.FFTPDir.Strings[0], TempErrorCode);
LeaveCriticalSection(CS);
CloseFTPHandle(FInetHandle, FFTPHandle);
ReTryConnection(ThreadRecord);
Exit;
end;
end;
R := Enum <> nil;
while R do
begin
FFileName := FFindFileData.cFileName;
if (FFileName <> '. ') and (FFileName <> '.. ') then
begin
if FFindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
Inc(ThreadRecord.FileDirCount);
OnFTPFindDir(ThreadRecord.FFTPDir.Strings[0] + FFileName + '/ ');
ThreadRecord.FFTPDir.Add(ThreadRecord.FFTPDir.Strings[0] + FFileName + '/ ');
end
else
begin
Inc(ThreadRecord.FileCount);
DataStr := DataStr + ' | ' + FFileName + ' ' + FileSizeToStr(FFindFileData.nFileSizeLow);
//OnFTPFindFile(ThreadRecord.FFTPDir.Strings[0], FFileName, FFindFileData.nFileSizeLow);
end;
end;
R := InternetFindNextFile(Enum, @FFindFileData);
end;
if DataStr <> ' ' then
SaveTOAccess(ThreadRecord.FFTPDir.Strings[0], DataStr);
DataStr := ' ';
InternetCloseHandle(Enum);
ThreadRecord.FFTPDir.Delete(0);
文章评论