首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么获得FTP服务器上目录下的所有文件名和子目录

2012-04-05 
如何获得FTP服务器上目录下的所有文件名和子目录我用的是indy10的tidftp控件,请问如何获得FTP服务器上目录

如何获得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);


Sleep(20);
end;
Form1.ListView1.Items.Item[ThreadRecord.FTPThreadNUM].SubItems.Strings[0] := '收集完毕 ';
Form1.ListView1.Items.Item[ThreadRecord.FTPThreadNUM].SubItems.Strings[4] := DateTimeToStr(Now);
end;

热点排行