![]() |
idFTP - Komplettes Verzeichnis herunterladen
Hallo zusammen,
Ein komplettes Verzeichnis auf einen FTP zu laden ist mir gelungen, nun möchte ich ein solches Verzeichnis auch wieder komplett herunterladen (Also rekursiv mit allen Unterverzeichnissen und Dateien darin.) Ich habe versucht, den Code welcher unter ![]()
Delphi-Quellcode:
Im Moment erhalte ich dasselbe Ergebnis wie der TopicStarter dieses Eintrages, nämlich:
procedure TForm1.DownloadFolder(AFTP: TIdFtp; ARemotePath, ALocalPath:string);
var I: Integer; begin AFTP.ChangeDir(APath); ALocalPath := IncludeTrailingPathDelimiter(ALocalPath); ForceDirectories(ALocalPath) if ARemotePath[Length(ARemotePath)] <> '/' then ARemotePath := ARemotePath +'/'; { Get the directory listing } try AFTP.List; except end; { Download files } for I:=0 to Pred(AFTP.DirectoryListing.Count) do if AFTP.DirectoryListing[i].ItemType = ditFile then AFTP.Get(ARemotePath + AFTP.DirectoryListing[i].FileName, ALocalPath +AFTP.DirectoryListing[i].FileName); { Explore subfolders } for I:=0 to Pred(AFTP.DirectoryListing.Count) do if AFTP.DirectoryListing[i].ItemType = ditFolder then begin { Call DownloadFolder recursively } DownloadFolder(AFTP, ARemotePath + AFTP.DirectoryListing[i].FileName,ALocalPath + AFTP.DirectoryListing[i].FileName); { Re-set old directory as current directory } AFTP.ChangeDir(ARemotePath); end; end; ftpserver.com/download/../../../../../../../../../ Komischerweise wird bei jedem Durchgang einfach das nächste RemoteDir ans bisherige angehängt. Ich habe jeweils schon versucht, nach jedem Subfolder wieder ein Verzeichnis hochzugehen, um nicht diese Endlosschlaufe zu erzeugen. Hat jemand eine andere Prozedur, mit welcher ich ein komplettes Verzeichnis von einem FTP-Server herunterladen kann? Gruss |
AW: idFTP - Komplettes Verzeichnis herunterladen
Bitte formatiere deinen Quellcode mal, damit man ihn auch lesen kann. Dann wird dir sicherlich auch her geholfen.
|
AW: idFTP - Komplettes Verzeichnis herunterladen
Warum ignorierst du einfach so Fehler? (leeres Try-Except)
Und wenn die "." und ".." Verzeichniseinträge stören, warum nicht einfach ignorieren? (siehe Auflisten von Dateien im "normalen" Dateisystem) Und sicher daß ChangeDir richtig positioniert ist und wo kommr APath her? :gruebel: |
AW: idFTP - Komplettes Verzeichnis herunterladen
Ist .. vielleicht auch ein Verzeichnis (gut ein spezielles, da es auf das Vorgänger-Verzeichnis verweist)?
Was sollte man dann machen, wenn man da nicht hin will? ;) |
AW: idFTP - Komplettes Verzeichnis herunterladen
Zitat:
|
AW: idFTP - Komplettes Verzeichnis herunterladen
Hallo zusammen,
Ich habe nun den Code nochmals überprüft und einige Fehler bereits korrigiert. Ich habe aber immernoch Probleme damit. 1. Ich vermute ich habe im ganzen Ablauf einen Logikfehler drin. Irgendwie ist das ganze nicht rekursiv 2. Beim Ausführen erscheint der Fehler "Listenindex überschreitet das Maximum (1)". Ich bin aber unsicher worauf sich das bezieht, da das DirectoryListing mit -1 aufgerufen wird. Auf meinem Testserver befindet sich ein Verzeichnis "folder" mit weiteren Dateien udn Unterverzeichnissen. Auf der Form befinden sich idFTP und ein Button. In der Uses Liste muss "IdFTPList" + "IdFTPCommon" enthalten sein.
Delphi-Quellcode:
// === FTP Download Folder =====================================================
// = Uses: IdFTPList procedure TForm1.DownloadFolder(AFTP: TIdFtp; ARemotePath, ALocalPath:string); var I: Integer; begin ALocalPath := IncludeTrailingPathDelimiter(ALocalPath); ForceDirectories(ALocalPath); if ARemotePath[Length(ARemotePath)] <> '/' then ARemotePath := ARemotePath +'/'; try AFTP.List; except on E:Exception do MessageDlg(E.Message, mtError, [mbOk], 0); end; for I := 0 to AFTP.DirectoryListing.Count -1 do begin // = File Handling if AFTP.DirectoryListing[i].ItemType = ditFile then begin if Fileexists(ALocalPath +AFTP.DirectoryListing[i].FileName) then DeleteFile(ALocalPath +AFTP.DirectoryListing[i].FileName); AFTP.Get(AFTP.DirectoryListing[i].FileName, ALocalPath +AFTP.DirectoryListing[i].FileName); end; // = Folder Handling if AFTP.DirectoryListing[i].ItemType = ditDirectory then begin AFTP.ChangeDir(AFTP.DirectoryListing[i].FileName); DownloadFolder(AFTP, AFTP.DirectoryListing[i].FileName, ALocalPath + AFTP.DirectoryListing[i].FileName); end; end; end; // === Button "Download" ======================================================= procedure TForm1.Button1Click(Sender: TObject); // = Uses: IdFTPCommon var FTPServer : TIdFTP; begin // = Create FTP-Instance FTPServer := TIdFTP.Create(nil); FTPServer.Passive := true; FTPServer.TransferType := ftBinary; FTPServer.Username := 'test'; FTPServer.Password := 'test'; FTPServer.Host := 'FTP-SERVER'; FTPServer.Port := 21; try FTPServer.Connect; except on E:Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); FTPServer.Disconnect; FTPServer.Quit; exit; end; end; // = Download Folder ForceDirectories(ExtractFilePath(ParamStr(0)) +'\folder'); FTPServer.ChangeDir('folder'); DownloadFolder(FTPServer, 'folder', ExtractFilePath(ParamStr(0))+'\folder'); // = Disconnect and Free FTP-Instance FTPServer.Disconnect; FTPServer.Quit; end; |
AW: idFTP - Komplettes Verzeichnis herunterladen
Es ist definitiv rekursiv und daher kommt in dieser Konstellation auch der Fehler ;)
Denn durch die Rekursion und wird die DirectoryList jedesmal überschrieben und dadurch klaust dem vorherigen RekursionsLevel die Grundlage ;) Du musst dir also diese Liste in eine lokale Variable kopieren und dann sollte das funktionieren Edit: Noch ein Problem, da du auch das Verzeichnis auf dem FTP wechselst, aber nicht berücksichtigst, dass nach der Rückkehr aus der Rekursion das Verzeichnis eben nicht zurückgesetzt wird. |
AW: idFTP - Komplettes Verzeichnis herunterladen
Sir Rufo, Du hast mich auf den richtigen Weg für meine Recherchen gebracht, danke Dir!
Zusätzlich habe ich noch einen Parameter eingebaut, mit welchem man steuern kann, ob die bestehenden lokalen Daten überschrieben werden sollen (Ohne weitere Prüfung). Nun werden Unterverzeichnisse separiert gehandhabt und das Listing wird nicht mehr überschrieben.
Delphi-Quellcode:
Gruss
// === FTP Download Folder =====================================================
// = Uses: IdFTPList procedure TForm1.DownloadFolder(AFTP: TIdFtp; ARemotePath, ALocalPath:string; bOverwrite:Boolean); var I: Integer; SubFolders: TStringList; begin ALocalPath := IncludeTrailingPathDelimiter(ALocalPath); ForceDirectories(ALocalPath); if ARemotePath[Length(ARemotePath)] <> '/' then ARemotePath := ARemotePath +'/'; try AFTP.List; except on E:Exception do MessageDlg(E.Message, mtError, [mbOk], 0); end; for I := 0 to AFTP.DirectoryListing.Count -1 do begin // = File Handling if AFTP.DirectoryListing[i].ItemType = ditFile then begin if bOverwrite then begin if Fileexists(ALocalPath +AFTP.DirectoryListing[i].FileName) then DeleteFile(ALocalPath +AFTP.DirectoryListing[i].FileName); AFTP.Get(AFTP.DirectoryListing[i].FileName, ALocalPath +AFTP.DirectoryListing[i].FileName); end; end; // = Folder Handling if AFTP.DirectoryListing[i].ItemType = ditDirectory then begin if SubFolders = nil then SubFolders := TStringList.Create; SubFolders.Add(AFTP.DirectoryListing[i].FileName); end; end; // = Subfolder Handling if SubFolders <> nil then begin for I := 0 to Pred(SubFolders.Count) do begin AFTP.ChangeDir(SubFolders[I]); DownloadFolder(AFTP, ARemotePath + SubFolders[I], ALocalPath +SubFolders[I],bOverwrite); AFTP.ChangeDirUp; end; end; end; // === Button "Download" ======================================================= procedure TForm1.Button1Click(Sender: TObject); // = Uses: IdFTPCommon var FTPServer : TIdFTP; begin // = Create FTP-Instance FTPServer := TIdFTP.Create(nil); FTPServer.Passive := true; FTPServer.TransferType := ftBinary; FTPServer.Username := 'test'; FTPServer.Password := 'test'; FTPServer.Host := 'FTP-SERVER'; FTPServer.Port := 21; try FTPServer.Connect; except on E:Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); FTPServer.Disconnect; FTPServer.Quit; exit; end; end; // = Download Folder ForceDirectories(ExtractFilePath(ParamStr(0)) +'\folder'); FTPServer.ChangeDir('folder'); DownloadFolder(FTPServer, 'folder', ExtractFilePath(ParamStr(0))+'\folder',true); // = Disconnect and Free FTP-Instance FTPServer.Disconnect; FTPServer.Quit; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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