Seite 1 von 2

Rekursives Löschen leerer Verzeichnisse auf einem FTP-Server

Verfasst: 09.02.2012 17:02
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.

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

Verfasst: 09.02.2012 19:09
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.

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

Verfasst: 14.02.2012 13:28
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.

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

Verfasst: 14.02.2012 14:07
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 

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

Verfasst: 14.02.2012 14:36
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????

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

Verfasst: 14.02.2012 15:40
von bobobo
Die Boardsuche nach "rekursiv" bringt (oder sollte bringen) eine anständige Liste von
rekursiven Verzeichnisauflistungen.
Daraus kann man sich sicher was ableiten.

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

Verfasst: 14.02.2012 16:30
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

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

Verfasst: 14.02.2012 16:55
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.

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

Verfasst: 14.02.2012 17:06
von HeX0R
Welchen FTP-Server benutzt du?
Mit IIS kommt PB nicht wirklich klar und zeigt nur Müll an.

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

Verfasst: 14.02.2012 17:12
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