Petite démo épurer de toutes fonctions de download ou upload. Juste pour montrer qu'il est inutile de charger les fichiers pour obtenir les icônes. Le résultat est le même que le rendu de FileZilla ou de n'importe quel autre logiciel de ftp.
J'ai laissé volontairement mes identifiants de connections afin de tester ce petit code. Pas de bétises avec FileZilla par exemple
Code : Tout sélectionner
; FTP : Lecture du contenu d'une connexion FTP
;
; Contributor : falsam
; OS : Windows
; Purebasic : 4.50++
EnableExplicit
Enumeration
#Ftp
#Mainform
#FileExplorer
EndEnumeration
Define.l Event, GEvent, TEvent
;Structure qui contiendra les informations des fichiers ou dossiers
Structure DirectoryEntry
Sort.s
Type.s
Name.s
Size.l
DateUpdate.l
EndStructure
Global NewList FTPDirectory.DirectoryEntry()
;Style de la fenetre principale
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
;Icone des dossiers par defaut
Global FolderIcon.l
Declare GetAssociatedFileIcon(IconPath.s, Value.l)
Declare FTPConnect()
Declare FTPReadDirectory()
Declare FTPDirectoryShow()
Declare Open_MainForm()
Declare Start()
;Cadrer une colonne à droite gauche ou au centre.
Procedure JustifyGadgetColumn(Gadget.l, Column.i, FMT.i)
Protected Lvc.LV_COLUMN
Lvc\Mask = #LVCF_FMT
Lvc\FMT = FMT ;#LVCFMT_LEFT or #LVCFMT_CENTER or #LVCFMT_RIGHT
SendMessage_(GadgetID(Gadget), #LVM_SETCOLUMN, Column, @Lvc)
EndProcedure
;Récupère l'icône associée à un fichier
Procedure GetAssociatedFileIcon(IconPath.s, Value.l)
Protected FileInfo.SHFILEINFO
SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | Value)
ProcedureReturn FileInfo\hIcon
EndProcedure
;Connection à un serveur ftp
Procedure FTPConnect()
Protected FtpUrl.s, FtpPort.i, FtpUser.s, FTPPassWord.s
;Renseignez vos identifiants ftp
FtpUrl = "s242132022.onlinehome.fr"
FtpPort = 21
FtpUser = "u48983622-pbr"
FTPPassWord = "purebasicdemo"
If OpenFTP(#ftp, FtpUrl, FTPUser, FTPPassWord, #PB_Ignore, FtpPort)
FTPReadDirectory()
Else
MessageRequester ("Information","Ooops la connexion n'a pas pu se faire",#PB_MessageRequester_Ok)
EndIf
EndProcedure
;Lecture des fichiers se trouvant sur le serveur ftp
;Chaque noms de fichier et dossiers est stocké dans une list
Procedure FTPReadDirectory()
ClearList(FTPDirectory())
ClearGadgetItems(#FileExplorer)
SetGadgetText(#FileExplorer,"")
If ExamineFTPDirectory(#ftp)
While NextFTPDirectoryEntry(#ftp)
AddElement(FTPDirectory())
FTPDirectory()\Type=Str(FTPDirectoryEntryType(#ftp))
FTPDirectory()\Name=FTPDirectoryEntryName(#ftp)
FTPDirectory()\Size=FTPDirectoryEntrySize(#ftp)
FTPDirectory()\DateUpdate=FTPDirectoryEntryDate(#ftp)
Select FTPDirectoryEntryType(#Ftp)
Case 1
FTPDirectory()\Sort="1"+FTPDirectoryEntryName(#Ftp)
Case 2
FTPDirectory()\Sort="0"+FTPDirectoryEntryName(#Ftp)
EndSelect
Wend
EndIf
EndProcedure
;Affichage de la liste
Procedure FTPDirectoryShow()
Protected Name.s, Type.s, Size.s, Date.s, Icon.l
SortStructuredList(FTPDirectory(),#PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(DirectoryEntry\sort),#PB_Sort_String)
ForEach FTPDirectory()
Name = FTPDirectory()\Name
Date = FormatDate("%dd/%mm/%yyyy %hh:%mm", FTPDirectory()\DateUpdate)
Select FTPDirectory()\Type
Case "1"
Type="Fichier"
Size = Str(FTPDirectory()\size)
Icon = GetAssociatedFileIcon(FTPDirectory()\Name, #SHGFI_SMALLICON | #SHGFI_USEFILEATTRIBUTES)
Case "2"
Type="Dossier"
Size=""
Icon = FolderIcon
EndSelect
If Name <>"."
AddGadgetItem(#FileExplorer,-1,Name + Chr(10) + Type + Chr(10) + Size + Chr(10) + Date, Icon)
EndIf
Next
EndProcedure
Procedure Open_MainForm()
OpenWindow(#Mainform, 0, 0, 500, 400, "Ftp Demo", WindowStyle)
ListIconGadget(#FileExplorer, 10, 10, 480, 380, "File", 200, #PB_ListIcon_FullRowSelect )
AddGadgetColumn(#FileExplorer, 1, "Type", 60)
AddGadgetColumn(#FileExplorer, 2, "Taille", 60)
AddGadgetColumn(#FileExplorer, 3, "Date", 100)
justifyGadgetColumn(#FileExplorer, 2, #LVCFMT_RIGHT)
EndProcedure
Procedure Start()
InitNetwork()
Open_MainForm()
FolderIcon = GetAssociatedFileIcon(GetHomeDirectory(), #SHGFI_SMALLICON)
FTPConnect()
FTPDirectoryShow()
EndProcedure
Start()
Repeat
Event = WaitWindowEvent(10)
GEvent = EventGadget()
TEvent = EventType()
Select Event
Case #PB_Event_Gadget
Select GEvent
Case #FileExplorer
If TEvent=#PB_EventType_LeftDoubleClick And GetGadgetItemText(#FileExplorer,GetGadgetState(#FileExplorer), 1) = "Dossier"
SetFTPDirectory(#Ftp, GetGadgetItemText(#FileExplorer,GetGadgetState(#FileExplorer), 0))
FTPReadDirectory()
FTPDirectoryShow()
EndIf
EndSelect
Case #PB_Event_CloseWindow
CloseFTP(#ftp)
End
EndSelect
ForEver