FTP Inhalt im Treegadget darstellen

Anfängerfragen zum Programmieren mit PureBasic.
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

FTP Inhalt im Treegadget darstellen

Beitrag von schleicher »

Hallo. Ich möchte meine Ordner und Dateien und alle Ebenen Unterordner und Dateinen vom Linux -Server in einem Treegadget darstellen, doch wie alle Unterordner und Dateien darstellen. Mir ist klar, das die Prozedurenschleife immer mit neuem Pfad wiederholt werden muss aber wie ich das im Code schreiben muss krieg ich im Kopf nicht rein.
Soweit bin ich :

Code: Alles auswählen

EnableExplicit
Global Button_Backup, List_FTP

Enumeration Window
  #Gui_1
  #Gui_2
EndEnumeration


Declare.s DirScan( DirectoryName.s) 


If OpenWindow(#Gui_1, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Button_Backup = ButtonGadget(#PB_Any, 212, 148, 196, 85, "Auswahl Backupdateien")
InitNetwork()
If OpenFTP(0, "192.168.40.1", "Username", "Password") ;bitte anpassen
Else 
  MessageRequester("Error", "Connecting failed")
  DisableGadget(Button_Backup, 1)
EndIf
Else
  MessageRequester("Error", "Can not open the Window")
EndIf


Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Select EventWindow()
          
        Case #Gui_1
          End
        Case #Gui_2
          HideWindow(#Gui_1, 0)
          CloseWindow(#Gui_2)
          
      EndSelect
      
      
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
      
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case  Button_Backup
          HideWindow(#Gui_1, 1)
          If OpenWindow(#Gui_2, 0, 0, 380, 700, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
            List_FTP = TreeGadget(#PB_Any, 8, 8, 324, 632, #PB_Tree_CheckBoxes)
            DirScan("/")
          EndIf
      EndSelect
  EndSelect
  
ForEver

Procedure.s DirScan(DirectoryName.s) 
  Protected entry.l
  
  If SetFTPDirectory(0, DirectoryName)
    If ExamineFTPDirectory(0)
      Repeat
        
        entry.l = NextFTPDirectoryEntry(0)
        
        If entry =1
          
          If FindString(FTPDirectoryEntryName(0), ">")=0  ;Links werden rausgefiltert
            AddGadgetItem(List_FTP, -1, FTPDirectoryEntryName(0))
          EndIf
        EndIf
        
      Until entry = 0
    EndIf
  EndIf
EndProcedure
Kann da jemand helfen ?
Zuletzt geändert von schleicher am 04.06.2015 12:02, insgesamt 1-mal geändert.
Purebasic 5.51
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Treegadget

Beitrag von mk-soft »

Recursive Funktion verwenden

Code: Alles auswählen

; ***************************************************************************************

Global NewList DirList.s()
Global NewList Filelist.s()

; ***************************************************************************************

Global thRead
Global foldername.s

; ***************************************************************************************

Procedure ReadDirectory(Folder.s, SubFolder.s = "")
  
  Protected id, filename.s, foldername.s, temp.s
  Static pos = 0
  
  If Right(Folder,1) <> "\"
    Folder + "\"
  EndIf
  foldername = Folder + SubFolder
  If Right(foldername,1) <> "\"
    foldername + "\"
  EndIf
  
  AddElement(DirList())
  DirList() = foldername
  
  ; - TreeGadget füllen
  If SubFolder
    AddGadgetItem(#GadgetTree, -1, Subfolder, 0, pos)
  Else
    ;AddGadgetItem(#GadgetTree, -1, Folder, 0, pos)
    AddGadgetItem(#GadgetTree, -1, "Start", 0, pos)
  EndIf
  pos + 1
  ; -
  
  id = ExamineDirectory(#PB_Any, foldername, "*.*")
  If id
    While NextDirectoryEntry(id)
      If DirectoryEntryType(id) = #PB_DirectoryEntry_File
        AddElement(Filelist())
        filename = foldername + DirectoryEntryName(id)
        FileList() = filename
        If IsStatusBar(#StatusBar)
          StatusBarText(#StatusBar, 0, Str(ListSize(Filelist())))
          StatusBarText(#StatusBar, 1, filename)
        EndIf
      Else
        temp = DirectoryEntryName(id)
        If temp <> ".." And temp <> "."
          ReadDirectory(foldername, temp)
        EndIf
      EndIf
    Wend
    FinishDirectory(id)
  EndIf
  
  pos - 1
  
  ProcedureReturn ListSize(Filelist())
  
EndProcedure

; ***************************************************************************************
Und dann am besten über Thread ausführen

Code: Alles auswählen

Procedure thReadDirectory(*foldername)
  
  Protected result, temp.s, count, foldername.s
  
  DisableMenuItem(#Menu, #Menu_Open, 1)
  
  foldername = PeekS(*foldername)
  WriteLog(#GadgetList, "Start read folder -> " + foldername)
  ClearList(DirList())
  ClearList(Filelist())
  ReadDirectory(foldername)
  
  WriteLog(#GadgetList, "End read folder; Files -> " + Str(ListSize(Filelist())))
  
  DisableMenuItem(#Menu, #Menu_Open, 0)
  
EndProcedure

Code: Alles auswählen

thRead = CreateThread(@thReadDirectory(), @foldername)
Muss natürlich noch auf FTP umgeschrieben werden
:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: FTP Inhalt im Treegadget darstellen

Beitrag von schleicher »

Danke für die Antwort. Ich als Anfänger habe nun versucht das in FTP umzusetzen. Sind wohl einige Fehler drin.
Klappt nicht so wie es soll. Wo sind die Fehler ?

Code: Alles auswählen

; ***************************************************************************************

EnableExplicit


Global NewList DirList.s()
Global NewList Filelist.s()

; ***************************************************************************************

Global thRead
Global foldername.s, *foldername

; ***************************************************************************************

Global Button_Backup, List_FTP

Enumeration Window
  #Gui_1
  #Gui_2
EndEnumeration

Enumeration Gadget
  #Statusbar
EndEnumeration

Enumeration
  #FTP
EndEnumeration


Declare ReadDirectory(Folder.s, SubFolder.s = "")
Declare thReadDirectory(*foldername)
Declare.s DirScan(Directoryname.s)

If OpenWindow(#Gui_1, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Button_Backup = ButtonGadget(#PB_Any, 212, 148, 196, 85, "Auswahl Backupdateien")
  InitNetwork()
  If OpenFTP(#FTP, "192.168.40.29", "root", "") ;bitte anpassen
  Else 
    MessageRequester("Error", "Connecting failed")
    DisableGadget(Button_Backup, 1)
  EndIf
Else
  MessageRequester("Error", "Can not open the Window")
EndIf


Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Select EventWindow()
          
        Case #Gui_1
          End
        Case #Gui_2
          HideWindow(#Gui_1, 0)
          CloseWindow(#Gui_2)
          
      EndSelect
      
      
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
      
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case  Button_Backup
          HideWindow(#Gui_1, 1)
          If OpenWindow(#Gui_2, 0, 0, 400, 700, "Backup- Auswahl", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
            CreateStatusBar(#Statusbar, WindowID(#Gui_2))
            AddStatusBarField(80)
            StatusBarText(#Statusbar, 0, "Label") 
            AddStatusBarField(320)
            StatusBarText(#Statusbar, 1, "File") 
            List_FTP = TreeGadget(#PB_Any, 8, 8, 380, 632, #PB_Tree_CheckBoxes)
          EndIf
          DirScan("/")
      EndSelect
  EndSelect
  
ForEver



Procedure.s DirScan(DirectoryName.s) 
  Protected entry.l
  
  If SetFTPDirectory(#FTP, DirectoryName)
    If ExamineFTPDirectory(#FTP)
      Repeat
        Delay(20)
        entry.l = NextFTPDirectoryEntry(#FTP)
        
        If entry =1
          
          If FindString(FTPDirectoryEntryName(#FTP), ">")=0  ;Links werden rausgefiltert
            *foldername = AllocateMemory(5000)
            PokeS(*foldername, FTPDirectoryEntryName(#FTP))
            
            If thRead = CreateThread(@thReadDirectory(), *foldername)
              Debug "Thread gestartet"
            EndIf
          EndIf
        EndIf
        
      Until entry = 0
    EndIf
  EndIf
EndProcedure






Procedure ReadDirectory(Folder.s, SubFolder.s = "")
  
  Protected id, filename.s, foldername.s, temp.s
  Static pos = 0
  
  If Right(Folder,1) <> "/"
    Folder + "/"
  EndIf
  If Left(Folder,1) <> "/"
    Folder = "/" + Folder
  EndIf
  foldername = Folder + SubFolder
  If Right(foldername,1) <> "/"
    foldername + "/"
  EndIf
  
  AddElement(DirList())
  DirList() = foldername
  
  ; - TreeGadget füllen
  If SubFolder
    AddGadgetItem(List_FTP, -1, Subfolder, 0, pos)
  Else
    AddGadgetItem(List_FTP, -1, Folder, 0, pos)
  EndIf
  pos + 1
  ; -
  
  id =SetFTPDirectory(#FTP, foldername)
  If ExamineFTPDirectory(#FTP)
    If id 
      While NextFTPDirectoryEntry(#FTP)
        
        If FTPDirectoryEntryType(#FTP) = 1
          
          AddElement(Filelist())
          filename = foldername + FTPDirectoryEntryName(#FTP)
          FileList() = filename
          
          If IsStatusBar(#StatusBar)
            StatusBarText(#StatusBar, 0, Str(ListSize(Filelist())))
            StatusBarText(#StatusBar, 1, filename)
          EndIf
          
        Else
          temp = FTPDirectoryEntryName(#FTP)
          AddGadgetItem(List_FTP, -1, temp, 0, pos)
          If temp <> ".." And temp <> "."
            ReadDirectory(foldername, temp) 
          EndIf
        EndIf
      Wend
      FinishFTPDirectory(#FTP)
    EndIf
  EndIf
  
  pos - 1
  
  ProcedureReturn ListSize(Filelist())
  
EndProcedure

Procedure thReadDirectory(*foldername)
  
  Protected foldername.s
  
  foldername = PeekS(*foldername)
  
  ClearList(DirList())
  ClearList(Filelist())
  ReadDirectory(foldername)
  
EndProcedure


; ***************************************************************************************
Purebasic 5.51
Antworten