Rekursives Löschen leerer Verzeichnisse auf einem FTP-Server

Anfängerfragen zum Programmieren mit PureBasic.
Amor_2001
Beiträge: 75
Registriert: 14.12.2011 19:20

Rekursives Löschen leerer Verzeichnisse auf einem FTP-Server

Beitrag von Amor_2001 »

Ich bin auf der Suche nach einem Code mit dem ich mich an einem FTP-Server anmelden kann, und anschließend ab einem Startdirectory rekursiv alle leeren Unterverzeichnisse löschen kann, bis auf das Startverzeichnis.

Kann mir jemand helfen?

Vielen Dank schon mal.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von HeX0R »

Vielleicht solltest du einfach mal anfangen was zu basteln, und wenn du nicht mehr weiterkommst fragen?

Ich glaube jetzt kaum, dass jemandem so fade ist, dass er dir das von nix auf alles zusammenkleistert.

Und die PB-FTP-Befehle sind eigentlich recht ordentlich dokumentiert.
Amor_2001
Beiträge: 75
Registriert: 14.12.2011 19:20

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von Amor_2001 »

Ich tue mich halt schwer mit einem rekursiven Code....
Leider haben auch die FTP-Directory-Befehle nicht alle Parameter der "normalen" Directory-Befehle. Sonst hätte ich das Beispiel dafür mal übgeschrieben.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von bobobo »

wie bitte ?
Warum geht dann folgendes ??
der Code ist aus der Hilfe zu FileSystem
etwas gepimpt mit den FTPGeschichten

Code: Alles auswählen

;pb4.60-winXP
If OpenWindow(0, 100, 200, 290, 200, "PureBasic - FileSystem Example")
  InitNetwork()
  ;StringGadget  (0,  10, 10, 202, 24, GetHomeDirectory())
  ButtonGadget  (1, 220, 10, 60 , 24, "List")
  ListViewGadget(2,  10, 40, 270, 150)
  ftpserver.s="Dein FTPServer"
  user.s="User"
  pw.s="Passwort"
  OpenFTP(0,ftpserver,user,pw)
  SetFTPDirectory(0,"httpdocs")
  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      If EventGadget() = 1 ; Read
        ClearGadgetItems(2)  ; Clear all the items found in the ListView
        If ExamineFTPDirectory(0);, GetGadgetText(0), "*.*")
          While NextFTPDirectoryEntry(0)
            FileName$ = FTPDirectoryEntryName(0)
            If FTPDirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              FileName$ = "[DIR] "+FileName$
            EndIf
            AddGadgetItem(2, -1, FileName$)
          Wend
        Else
          MessageRequester("Error","Can't examine this directory: "+GetGadgetText(0),0)
        EndIf
      EndIf
    EndIf
  Until EventID = #PB_Event_CloseWindow
CloseFTP(0)
EndIf
End 
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Amor_2001
Beiträge: 75
Registriert: 14.12.2011 19:20

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von Amor_2001 »

@bobobo
danke für den Code.

Leider zeigt er von 9 Verzeichnissen nur 4 an. Und leider auch nicht die Unterverzeichnisse darunter.
Hast du noch eine weitere Idee????
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von bobobo »

Die Boardsuche nach "rekursiv" bringt (oder sollte bringen) eine anständige Liste von
rekursiven Verzeichnisauflistungen.
Daraus kann man sich sicher was ableiten.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von STARGÅTE »

Amor_2001 hat geschrieben:Hast du noch eine weitere Idee????
Eigentlich solltest du die Ideen haben.

Vorab:
In FTP ist es sehr Zeitintensiv, alle Verseichnisse gleichzeitig auszulesen.
Nicht ohne Grund gibt es bei ExamineFTPDirectory() kein Parameter für das Verzeichnis,
weil dieses nämlich immer "per Hand" gesetzt werden muss.

Hier mal ein Code, zum Auslesen eines Kompletten FTP-Ordners inklusive Unterordner:

Code: Alles auswählen

; Verzeichniswechsel mit Pfad-Unterstützung
Procedure SetFTPDirectoryEx(FTP, Directory.s)
	If GetPathPart(Directory)
		SetFTPDirectoryEx(FTP, Trim(GetPathPart(Directory), "/"))
	EndIf
	SetFTPDirectory(FTP, GetFilePart(Directory))
EndProcedure

; Rekursives Auslesen eines Pfads
Procedure ExamineFTPDirectoryRecusive(FTP.i, Directory.s, Level.i=0)
	Protected NewList Folder.s()
	Protected NewList File.s()
	SetFTPDirectoryEx(FTP, Directory)
	If ExamineFTPDirectory(FTP)
		; Erst mal alles lesen ...
		While NextFTPDirectoryEntry(FTP)
			Select FTPDirectoryEntryType(FTP)
				Case #PB_FTP_File
					AddElement(File()) : File() = FTPDirectoryEntryName(FTP)
				Case #PB_FTP_Directory
					AddElement(Folder()) : Folder() = FTPDirectoryEntryName(FTP) 
			EndSelect
		Wend
		; ... und jetzt die Unterordner durchsuchen
		ForEach Folder()
			Debug Space(Level*2) + "+ " + Folder()
			ExamineFTPDirectoryRecusive(FTP, Folder(), Level+1) ; Unterordner auflisten
			SetFTPDirectory(FTP, "..") ; Zurückspringen
		Next
		ForEach File()
			Debug Space(Level*2) + "   " + File()
		Next
	EndIf
EndProcedure

Enumeration
	#FTP
EndEnumeration

InitNetwork()

If OpenFTP(#FTP, "*Server*", "*Benutzer*", "*Passwort*")
	ExamineFTPDirectoryRecusive(#FTP, "*Pfad*")
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Amor_2001
Beiträge: 75
Registriert: 14.12.2011 19:20

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von Amor_2001 »

Vielen Dank @STARGATE

Ich finde den Code übersichtlich und er hat mir auch ein beim Verständnis zu FTP geholfen.

Leider zeigt mein Debug-Fenster nur folgendes an...

+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50
+ [RWCEAFMS] fotoagentur1 512 Feb 13 02:33 API_NRW_50

... und nicht die Unterverzeichnisnamen. Habe auch schon experimientiert, das Ergebnis bleibt aber leider.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von HeX0R »

Welchen FTP-Server benutzt du?
Mit IIS kommt PB nicht wirklich klar und zeigt nur Müll an.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rekursives Löschen leerer Verzeichnisse auf einem FTP-Se

Beitrag von STARGÅTE »

Die Ordnernamen wurden mich auch etwas ...

Habe noch ein paar sicherheitsabfragen mit eingebaut, bitte noch mal testen:

Code: Alles auswählen

; Verzeichniswechsel mit Pfad-Unterstützung
Procedure SetFTPDirectoryEx(FTP, Directory.s)
	If GetPathPart(Directory)
		If SetFTPDirectoryEx(FTP, Trim(GetPathPart(Directory), "/"))
			ProcedureReturn SetFTPDirectory(FTP, GetFilePart(Directory))
		EndIf
	Else
		ProcedureReturn SetFTPDirectory(FTP, Directory)
	EndIf
EndProcedure

; Rekursives Auslesen eines Pfads
Procedure ExamineFTPDirectoryRecusive(FTP.i, Directory.s, Level.i=0)
	Protected NewList Folder.s()
	Protected NewList File.s()
	If SetFTPDirectoryEx(FTP, Directory)
		If ExamineFTPDirectory(FTP)
			; Erst mal alles lesen ...
			While NextFTPDirectoryEntry(FTP)
				Select FTPDirectoryEntryType(FTP)
					Case #PB_FTP_File
						AddElement(File()) : File() = FTPDirectoryEntryName(FTP)
					Case #PB_FTP_Directory
						AddElement(Folder()) : Folder() = FTPDirectoryEntryName(FTP) 
				EndSelect
			Wend
			; ... und jetzt die Unterordner durchsuchen
			ForEach Folder()
				Debug Space(Level*2) + "+ " + Folder()
				ExamineFTPDirectoryRecusive(FTP, Folder(), Level+1) ; Unterordner auflisten
				SetFTPDirectory(FTP, "..") ; Zurückspringen
			Next
			ForEach File()
				Debug Space(Level*2) + "   " + File()
			Next
		Else
			Debug "* Verzeichnisauflistung fehlgeschlagen * : "+Directory
		EndIf
	Else
		Debug "* Verzeichneswechsel nicht möglich * : "+Directory
	EndIf
EndProcedure

Enumeration
	#FTP
EndEnumeration

InitNetwork()

If OpenFTP(#FTP, "Server", "User", "Password")
	ExamineFTPDirectoryRecusive(#FTP, ".") ; Hauptverzeichnis
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten