Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
Delphi 7 Professional
|
FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
11. Nov 2006, 16:23
Hallo allerseits,
ich möchte mit folgendem Code alle Dateien eines Verzeichnisses inkl. Unterverzeichnisse vom Server herunterladen.
Leider funktioniert der Code nur im ersten Verzeichnis. Wenn sich danach die Funktion DLDateien rekursiv aufruft, ergibt das Resultat von hSearch NIL. Was mache ich hier falsch bzw. wie könnte man das Problem lösen?
Delphi-Quellcode:
Uses WinInet;
function TForm1.DLVerz(Server, User, Passwort, LokalVerz, ServerVerz: String): Boolean;
var
FindFileData: TWin32FindData;
hSession, hConnect, hSearch: HINTERNET;
function DLDateien(LokalPfad, ServerPfad: String): Boolean;
begin
result := false;
if NOT FtpSetCurrentDirectory(hConnect, PChar(ServerPfad)) then Fehler;
LokalPfad := IncludeTrailingPathDelimiter(LokalPfad);
if NOT DirectoryExists(LokalPfad) then MkDir(LokalPfad);
ChDir(LokalPfad);
hSearch := FtpFindFirstFile(hConnect, nil, FindFileData, 0, 0);
if (hSearch <> nil) then
begin
repeat
if (FindFileData.dwFileAttributes AND FILE_ATTRIBUTE_DIRECTORY = 0) then
begin
// Datei
if NOT FtpGetFile(hConnect, PChar(FindFileData.cFileName), PChar(LokalPfad+FindFileData.cFileName),
false, 64, FTP_TRANSFER_TYPE_UNKNOWN, 0) then Fehler;
end else
begin
// Verzeichnis
if ((String(FindFileData.cFileName) <> '.') AND (String(FindFileData.cFileName) <> '..')) then
if NOT DLDateien(PChar(LokalPfad+FindFileData.cFileName),
PChar(ServerPfad+FindFileData.cFileName)) then Fehler
end;
until NOT (InternetFindNextFile(hSearch, @FindFileData));
InternetCloseHandle(hSearch);
end;
end;
begin // DLVerz
hSession := InternetOpen('Test', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
if (hSession <> nil) then
begin
hConnect := InternetConnect(hSession, PChar(Server), 21, PChar(User), PChar(Passwort),
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (hConnect <> nil) then
begin
Result := DLDateien(LokalVerz, ServerVerz);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;
end;
end;
mfg
Herbert
|
|
Zitat
|