Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Wininet und FTP (Verzeichnis rekursiv löschen) (https://www.delphipraxis.net/7769-wininet-und-ftp-verzeichnis-rekursiv-loeschen.html)

md787 21. Aug 2003 07:06


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

Luckie 21. Aug 2003 07:22

Re: Wininet und FTP (Verzeichnis rekursiv löschen)
 
Zitat:

Zitat von md787
Aber genau da ist mein Problem, da FtpFindFirstFile ja beendet werden muss um weiter suchen zu können.

Das verstehe ich jetzt nicht.

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.

md787 21. Aug 2003 07:55

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?

Luckie 21. Aug 2003 08:23

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.

http://www.luckie-online.de/files/my...monitorsfx.exe Läuft aber nur korrekt unter 2000 und wahrscheinlich XP.

md787 21. Aug 2003 08:36

Re: Wininet und FTP (Verzeichnis rekursiv löschen)
 
Hi,
danke erstmal für den Monitor.

Delphi-Quellcode:
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;
Meinst du das in etwa so (hab ich jetzt geschrieben aber von Prinzip)?

Und danke für die Geduld.

MfG

Luckie 21. Aug 2003 08:37

Re: Wininet und FTP (Verzeichnis rekursiv löschen)
 
Ja so ungefähr.

md787 21. Aug 2003 08:43

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

md787 21. Aug 2003 08:46

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

md787 21. Aug 2003 13:18

Re: Wininet und FTP (Verzeichnis rekursiv löschen)
 
Hi,
also ich hab es geschafft.

Wollte mich nur nochmal ganz herzlich bei Luckie bedanken.

MfG

Luckie 21. Aug 2003 13:26

Re: Wininet und FTP (Verzeichnis rekursiv löschen)
 
Und wie hast du es geschaft?

md787 21. Aug 2003 13:44

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?

md787 21. Aug 2003 14:00

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:
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;
wobei ihr die funktion GetFolderPath auch wegdenken könnt. Die schneidet nur das Laufwerk raus.

MfG

M_O_C 3. Dez 2003 22:36

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 06:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz