![]() |
Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
ich hab ein grosses Problem. Ich will ein Ordner auf einem FTP Server löschen. Die Funktion FtpRemoveDirectory löscht das Verzeichnis ja nur wenn es leer ist. Damit muss ich erstmal rekursiv die Verzeichnisse löschen und dann diese nacheinander löschen. Aber genau da ist mein Problem, da FtpFindFirstFile ja beendet werden muss um weiter suchen zu können. Vielleicht hatte ja jemand ein ähnliches Problem und kann mir ein Denkanstoss geben. Würde mich freuen. MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Zitat:
Aber meines Erachtens sollte es mit den FTP-Funktionen genauso gehen, wie mit den localen Gegenstücken. Und dazu findest du Code hier in der Code Lib. |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
Ertsmal danke für die schnelle Antwort. Das stimmt auch, nur mit dem Unterschied das man nur einmal die FindFirst aufrufen kann. Somit kannst du auf der lokalen Ebene das in der Schleife rekursiv wieder aufrufen. Leider geht es dort nicht, weil er dann mit Suche schon im Gange abbricht. Is immernoch nicht sehr verständlich. Ähm wie kann ich das erklären. Mal ein kurzes stück von meinem source: var hSearch: HINTERNET; findData: WIN32_FIND_DATA; begin hSearch := FtpFindFirstFile(hFTP,nil,findData,0,0); repeat // Delete Files and Folder until not InternetFindNextFile(hSearch,@findData); InternetCloseHandle(hSearch); end; Also in der repeat Schleife kann ich das nicht mehr aufrufen. Es ist eigentlcih sehr trivial, aber es will nicht. Hab gedacht vielleicht hatte jemand schon das gleiche Problem und hat eine elegante Lösung gefunden. Spontan ist mit eingefallen die Verzeichnisse in einer Liste zwischenzuspeichern, aber das war auch nicht so gut. MfG PS: Hab ich total vergessen. Ich hab in einen Post gelesen dass Du einen Ineternetmonitor programmiert hast und das zum download angeboten hast. Wollte nur mal nachfragen ob ich den vielleicht mir mal angucken könnte? |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Du darfst nicht FTPFindFirst in deiner Schleife aufrufen, sonder du mußt deine Funktion wieder aufrufen und zwar mit dem dem ersten gefunden Verzeichnis als neues Startverzeichnis.
![]() |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
danke erstmal für den Monitor.
Delphi-Quellcode:
Meinst du das in etwa so (hab ich jetzt geschrieben aber von Prinzip)?
procedure WasAuchImmer(hFTP: HINTERNET; Pfad: String);
var hSearch: HINTERNET; findData: WIN32_FIND_DATA; begin //FtpSetCurrentDir(hFTP, PChar(Pfad)); // oder hSearch := FtpFindFirstFile(hFTP,PChar(Pfad),findData,0,0); <- Das hab ich nicht getestet // sollte aber auch funktionieren hSearch := FtpFindFirstFile(hFTP,nil,findData,0,0); repeat if Folder then WasAuchImmer(hFTP, Pfad + '\' + findData.cfFilename + '\'); until not InternetFindNextFile(hSearch,@findData); InternetCloseHandle(hSearch); end; Und danke für die Geduld. MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Ja so ungefähr.
|
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
und genau da ist das Problem. hSearch := FtpFindFirstFile(hFTP,nil,findData,0,0); <- wird damit rekursiv aufgerufen und das geht nicht. MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Moment mir fällt gerade ein.
Ich kann ja den Search Handle ausserhalb der procedure erstellen und dann diesen mit übergeben. EDIT: Auch Blödsinn. MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
also ich hab es geschafft. Wollte mich nur nochmal ganz herzlich bei Luckie bedanken. MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Und wie hast du es geschaft?
|
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Hi,
eigentlich wie ich zu erst gedacht hatte (die ersten sind meistens die besten ideen ;) ). Es ist die nicht elegante Version (zwichenspeichern). Das hab ich zum Anfang auch versucht, nur vergessen die Verzeichnisse noch zu löschen :( War wahrscheinlich schon zu spät am Abend ;) Naja da finde ich die INDY Komponenten schon besser, nur die haben probleme gemacht. Ach wenn ich schon am tippen bin ;) Der Inet Monitor war leider nicht was ich gesucht hab oder falsch gelesen ;) Zumindest such ich noch ein wenig was über InternetStatusCallback, vielleicht hat da jemand noch ein kleines Source Code Stück. Würde mich freuen. MfG PS: Ist jemand schonmal aufgefallen das das letzte Verzeichnis wenn es leer ist nicht als Verzeichnis sondern als File erkannt wird? |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
vielleicth sollte ich einfach mal den source hier reinpacken, ich hab nämlich gar nichts ähnliches im internet gefunden.
Vielleicht findet sich ja jemand der ihn noch verbessert oder jemand anderen nützt das als anfang.
Delphi-Quellcode:
wobei ihr die funktion GetFolderPath auch wegdenken könnt. Die schneidet nur das Laufwerk raus.
procedure DeleteFolderRecursive(hFTP: HINTERNET; Path: String);
var hSearch: HINTERNET; findData: WIN32_FIND_DATA; TempList: TStringList; i: Integer; begin TempList := TStringList.Create; try hSearch := FtpFindFirstFile(hFTP,PChar(GetFolderPath(Path)),findData,0,0); repeat if findData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then begin if not FtpRemoveDirectory(hFTP, PChar(GetFolderPath(Path))) then begin TempList.Add(Path + findData.cFileName + '\'); end; end else begin if not FtpDeleteFile(hFTP, PChar(GetFolderPath(Path) + findData.cFileName)) then Main_Extras.ErrorPrint('Could not delete File ' + Path + findData.cFileName + '.', 'FTP File Delete Error'); end; until not InternetFindNextFile(hSearch,@findData); InternetCloseHandle(hSearch); for i:=0 to TempList.Count-1 do begin DeleteFolderRecursive(hFTP, TempList[i]); if not FtpRemoveDirectory(hFTP, PChar(GetFolderPath(TempList[i]))) then Main_Extras.ErrorPrint('Could not delete Folder ' + TempList[i] + '.', 'FTP Folder Delete Error'); end; finally TempList.Free; end; end; MfG |
Re: Wininet und FTP (Verzeichnis rekursiv löschen)
Ich habe das gleiche Problem,
aber ich habe erst gerade mit dem Delphi-Proggen anfangen und benutze aus diesem Grund die Indy-Variante(IdFTP). Ich habe versucht den CodeSchnipsel in mein Prog einzubinden nur leider hat es nicht funktioniert! Welche Units muss ich zusätzlich einbinden um das nutzen zu können? Oder kennt jemand ne Lösung für die Indy-Variante? Muß ich vielleicht nur einige Variablen umbennen? Tut mir Leid dass ich so dumme fragen stelle bin aber wirklich real anfänger!(zumindest beim Delphi-Proggen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 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