![]() |
FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
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:
mfg
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; Herbert |
Re: FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
Hallo Herbert,
du musst jedes Unterverzeichnis in einer eigenen Session abarbeiten: WinInet Reference : Functions : FtpFindFirstFile ... FtpFindFirstFile is similar to the FindFirstFile function. Note, however, that only one FtpFindFirstFile can occur at a time within a given FTP session. The enumerations, therefore, are correlated with the FTP session handle. This is because the FTP protocol allows only a single directory enumeration per session. ... Grüße vom marabu |
Re: FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
und wie kann ich das am besten lösen ?
mfg Herbert |
Re: FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
Habe ich mich denn so unverständlich ausgedrückt? Du musst einfach das session handling und den Code der lokalen Funktion DLDateien zusammenlegen, so dass für jedes Verzeichnis eine eigene Session erstellt wird. Dabei kannst du auch gleich den Fehler bei der Freigabe der Session beheben. Oder ist das garnicht dein eigener Code?
Freundliche Grüße |
Re: FtpFindFirstFile (WinInet) rekursiv - funktioniert nicht
Ich habe zwar verstanden, worum es geht, aber die Umsetzung ist dennoch unverständlich.
Ich habe das Problem vorerst so gelöst, dass ich innerhalb der Funktion DLDateien alle eingelesenen Verzeichnisnamen in einer Stringliste speichere und diese nach jedem InternetFindNextFile abarbeite. Es ist dies sicherlich nicht die schnellste Methode aber sie funktioniert wenigstens mal. Vielleicht hat jemand anderer mal eine bessere Lösung parat. Eine umfangreiche Suche im Internet brachte leider keinen Erfolg. mfg Herbert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz