Page 1 sur 1

Probleme de ftp ...

Publié : ven. 05/nov./2004 14:49
par lazy
Voila, je vous explique : Je suis entrin de faire un programme qui se connecte a un ftp, qui se dirige dans un rep et qui affiche le contenue du repertoire! J'ai reussi a faire tout ca en m'aidant des aides sur le net!

Voila le code que jutilise :D

Code : Tout sélectionner

Enumeration
  #Window_0
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_4
  #MENU_7
  #MENU_5
  #MENU_11
  #MENU_12
  #MENU_14
  #MENU_15
  #MENU_16
  #MENU_18
  #MENU_19
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Gadget_1
  #Gadget_2
  #Gadget_3
  #Gadget_4
  #Gadget_5
  #Gadget_6
  #Gadget_7
  #Gadget_8
  #Gadget_9  
EndEnumeration

Procedure GetFTPinfo() 
  InternetGetLastResponseInfo_(@lpdwError.l, 0, @lpdwBufferLength.l) 
  If lpdwBufferLength > 0 
    lpszBuffer$ = Space(lpdwBufferLength) 
    If InternetGetLastResponseInfo_(@lpdwError, @lpszBuffer$, @lpdwBufferLength) 
      CRLF$ = Chr(13) + Chr(10) 
      posA.l = FindString(lpszBuffer$, CRLF$, 0) 
      If posA 
        AddGadgetItem(#Gadget_7, 0, (Left(lpszBuffer$, posA - 1)))
        StatusBarText(0, 1, (Left(lpszBuffer$, posA - 1)), #PB_StatusBar_BorderLess)
        UpdateStatusBar(0)
        posA + 2 
        posB.l = FindString(lpszBuffer$, CRLF$, posA) 
        While posB 
          AddGadgetItem(#Gadget_7, 0,(Mid(lpszBuffer$, posA, posB - posA)))
          StatusBarText(0, 1, (Mid(lpszBuffer$, posA, posB - posA)), #PB_StatusBar_BorderLess)
          UpdateStatusBar(0)
          posA = posB + 2 
          posB = FindString(lpszBuffer$, CRLF$, posA)          
        Wend 
      Else 
        AddGadgetItem(#Gadget_7, -1,(lpszBuffer$))
        StatusBarText(0, 1, (lpszBuffer$), #PB_StatusBar_BorderLess)
        UpdateStatusBar(0)
      EndIf 
    EndIf 
    ;AddGadgetItem(#Gadget_7, -1, "") 
  EndIf 
EndProcedure

Procedure.l FTPInit() 
  ProcedureReturn InternetOpen_("FTP",1,"","",0) 
EndProcedure 


Procedure.l FTPConnect(hInternet,Server.s,User.s,Password.s,Port.l) 
  ProcedureReturn InternetConnect_(hInternet,Server,Port,User,Password,1,0,0) 
EndProcedure 


Procedure.l FTPDir(hConnect.l) 
  hFind=FtpFindFirstFile_(hConnect,"*.*",@FTPFile.WIN32_FIND_DATA,0,0) 
  If hFind 
    Find=1
    AddGadgetItem(#Gadget_2, -1,PeekS(@FTPFile\cFileName))
    While Find 
      Find=InternetFindNextFile_(hFind,@FTPFile) 
      If Find 
        AddGadgetItem(#Gadget_2, -1,PeekS(@FTPFile\cFileName)) 
      EndIf      
    Wend 
  EndIf 
EndProcedure 


Procedure.l FTPSetDir(hConnect.l,Dir.s) 
  ProcedureReturn FtpSetCurrentDirectory_(hConnect,Dir) 
EndProcedure 


Procedure.l FTPCreateDir(hConnect.l,Dir.s) 
  ProcedureReturn FTPCreateDirectory_(hConnect,Dir) 
EndProcedure 


Procedure.l FTPDownload(hConnect.l,Source.s,Dest.s) 
  ProcedureReturn FTPGetFile_(hConnect,Source,Dest,0,0,0,0) 
EndProcedure 


Procedure.l FTPClose(hInternet.l) 
  ProcedureReturn InternetCloseHandle_(hInternet) 
EndProcedure 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 266, 276, 600, 440,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "Divx4Ever Pro-Jekt")
    If CreateMenu(#MenuBar_0, WindowID())
      MenuTitle("Fichiers")
      MenuItem(#MENU_4, "Ouvrir"+Chr(9)+"Ctrl+O")
      MenuBar()
      MenuItem(#MENU_7, "Options"+Chr(9)+"Ctrl+P")
      MenuBar()
      MenuItem(#MENU_5, "Quitter"+Chr(9)+"Esc")
      MenuTitle("Connexion")
      MenuItem(#MENU_11, "Connexion au ftp"+Chr(9)+"Ctrl+Enter")
      MenuBar()
      MenuItem(#MENU_12, "Deconnexion du ftp"+Chr(9)+"Ctrl+F4")
      MenuTitle("Téléchargement")
      MenuItem(#MENU_14, "Séléctionner tout"+Chr(9)+"Ctrl+A")
      MenuItem(#MENU_15, "Désélectionner tout"+Chr(9)+"Ctrl+D")
      MenuBar()
      MenuItem(#MENU_16, "Télécharger !")
      MenuTitle("Aide")
      MenuItem(#MENU_18, "Aide"+Chr(9)+"F1")
      MenuBar()
      MenuItem(#MENU_19, "A Propos"+Chr(9)+"Ctrl+F1")
    EndIf
    
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Escape, #Menu_5)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_a, #Menu_14)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_d, #Menu_15)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_p, #Menu_7)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_o, #Menu_4)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_F1, #Menu_19)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_Return, #Menu_11)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_Control|#PB_Shortcut_F4, #Menu_12)
      AddKeyboardShortcut(#Window_0, #PB_Shortcut_F1, #Menu_18)
    
    If CreateGadgetList(WindowID())
      Frame3DGadget(#Gadget_1, 10, 0, 580, 240, "Fichier(s) disponible(s) sur le serveur.")
      ListIconGadget(#Gadget_2, 20, 20, 560, 210,"",0, #PB_ListIcon_CheckBoxes|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#Gadget_2, 0, "Nom des fichiers", 300)
      AddGadgetColumn(#Gadget_2, 1, "Etat", 235)
      Frame3DGadget(#Gadget_3, 10, 250, 580, 60, "Fichier en téléchargement ")
      ProgressBarGadget(#Gadget_4, 20, 290, 500, 10, 0, 10)
      StringGadget(#Gadget_8, 530, 285, 40, 17, "",#PB_String_BorderLess|#PB_Text_Right)
      TextGadget(#Gadget_9, 573, 285, 10, 20, "%")            
      StringGadget(#Gadget_5, 20, 267, 560, 17, "", #PB_String_BorderLess | #PB_String_ReadOnly)
      Frame3DGadget(#Gadget_6, 10, 315, 580, 85, "Connexion au ftp !")
      EditorGadget(#Gadget_7, 20, 330, 560, 60, "")      
    EndIf

    If CreateStatusBar(0, WindowID())
      AddStatusBarField(45)
      AddStatusBarField(205)
      AddStatusBarField(150)
      AddStatusBarField(200)
    EndIf    
      StatusBarText(0, 0, "Status :", #PB_StatusBar_BorderLess)
      StatusBarText(0, 1, "* Etat de la connexion *", #PB_StatusBar_BorderLess)
      StatusBarText(0, 2, "Téléchargement : ", #PB_StatusBar_BorderLess)
      StatusBarText(0, 3, "Created by Laz`76 for Divx4Ever", #PB_StatusBar_Right | #PB_StatusBar_BorderLess) 
      UpdateStatusBar(0)    
  Repeat

    Select WaitWindowEvent()

      Case #PB_EventMenu

        Select EventMenuID()  ; To see which menu has been selected

          Case 11 ; About
            MessageRequester("About", "Cool Menu example", 0)
          
          Case #Menu_11             
            url$ = "IP" 
            user$ = "USER" 
            pass$ = "PASS"
            port = 21
            dir$ ="Repertoire"
            hInternet=FTPInit() 
            If hInternet
              hInternet1.l = InternetOpen_("", 1, 0, 0, 0) 
              hConnect1.l = InternetConnect_(hInternet, @url$, port, @user$, @pass$, 1, 0, 0)            
              GetFTPinfo()              
              hConnect=FTPConnect(hInternet,url$,user$,pass$,port) 
                If hConnect 
                  FTPSetDir(hConnect,dir$)
                  FTPDir(hConnect)                  
                  ;FTPDownload(hConnect,"hello.txt","C:\download.txt") 
                Else
                  MessageRequester("Erreur","Désolé, le serveur est inaccessible"+Chr(10)+"Veuillez réessayer plus tard",0)
                EndIf 
            Else
              MessageRequester("Erreur","Désolé, le serveur est inaccessible"+Chr(10)+"Veuillez réessayer plus tard",0)                
            EndIf 
            
          Case #Menu_12
            ClearGadgetItemList(#Gadget_2)
            
          Case #Menu_16
            If GetGadgetState(#Gadget_2) = -1
            MessageRequester("Erreur","Vous devez selectionner un élément!",0)
            Else
            result = GetGadgetItemState(#Gadget_2, GetGadgetState(#Gadget_2))
            If result = 1 Or result = 0
            MessageRequester("info","L'element n'est pas coché",0)
            ElseIf result = 3 Or result = 2
            MessageRequester("info","L'element est coché",0)
            Else
            MessageRequester("info",Str(result),0)
            EndIf
            EndIf
            
          Case #Menu_7
            AddGadgetItem(#Gadget_2, 0, "toto")
            SetGadgetItemText(#Gadget_2, 0, "Encore un test", 1) 
            
          Case #Menu_4
            SetGadgetText(#Gadget_5, "Test") 
            
          Case #Menu_14
            nbelem = CountGadgetItems(#Gadget_2) 
            For a = 0 To nbelem
              SetGadgetItemState(#Gadget_2,a,#PB_ListIcon_Checked)
            Next
            
          Case #Menu_15
            nbelem = CountGadgetItems(#Gadget_2) 
            For a = 0 To nbelem
              SetGadgetItemState(#Gadget_2,a,0)
            Next 
          Case #Menu_19
            nbelem = CountGadgetItems(#Gadget_2) 
            For a = 0 To nbelem-1
              result = GetGadgetItemState(#Gadget_2, a)
            If result = 3 Or result = 2
            SetGadgetText(#Gadget_5, GetGadgetItemText(#Gadget_2, a,0))
            AddGadgetItem(#Gadget_7,-1, "150 Opening BINARY mode data connection for "+GetGadgetItemText(#Gadget_2, a,0))
            ;FTPDownload(hConnect,dir$+GetGadgetItemText(#Gadget_2, a,0),GetGadgetItemText(#Gadget_2, a,0))
            EndIf
            Next
                        
          Case #Menu_5
            Quit=1          
          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenuID()), 0)          
          
        EndSelect

      Case #WM_CLOSE ; #PB_EventCloseWindow
        FTPClose(hInternet)
        Quit = 1

    EndSelect

  Until Quit = 1
    
  EndIf
EndProcedure
Open_Window_0()
Maintenant j'en viens a mes problèmes :D
- J'aimerais que la connexion se fasse en arrière plan pour que le programme reste accessible durant la connexion!
- J'aimerais avoir la taille des fichiers, car la j'arrive a afficher les fichiers mais j'arrive pas a avoir leur taille :(
- J'aimerais aussi que quand on telecharge les fichiers, il s'affiche en dessous (dans l'endroit prevu a cet effet :p) Et que la barre de progression augmente en fonction du telechargement.

Voila en gros, se sont cela mes problèmes, si un d'entre vous sait repondre , ca serais bien gentil :p

@++Laz`76

Publié : ven. 05/nov./2004 15:32
par gansta93
Pour la conection en arrière plan, tu devrais essayer un Thread. Je pense que le programme, de cette manière, restera accessible.

Publié : ven. 05/nov./2004 16:45
par lazy
Oui, je sais mais j'arrive pas a le faire avec le theard, serait tu m'indiqué comment je dois faire merci :D

Ma contribution

Publié : ven. 05/nov./2004 17:32
par DominiqueB
Voici un bout de code qui te permettra de récuppérer quelques infos sur les fichiers à télécharger. Certaines parties sont tirées d'exemples dont les auteurs sont cités en entête.
Mon programme est plus complet que cela, j'en ai fait une extraction pour répondre à ta question.

Code : Tout sélectionner

; FTP File Exchanger for transferring files via FTP protocol
; written by Terry Hough, updated 05/20/2003
; Many thanks for code, ideas, examples, etc. to Fweil, Freak, PB, Paul, 
; Danillo and others on the PureBasic Forum.
;******************************************************************************
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1708&highlight=
; Author: Pille
; Date: 15. July 2003
; RC4Mem for PB by Pille, 15.07.2003 
; Special Thanks to Rings 
;******************************************************************************

DefType.WIN32_FIND_DATA PB_FIND_DATA

Structure PB_FIND_DATA
  FileAttributes.l
  CreationTimeL.l
  CreationTimeH.l
  LastAccessTimeL.l
  LastAccessTimeH.l
  LastWriteTimeL.l
  LastWriteTimeH.l
  FileSizeHigh.l
  FileSizeLow.l
  OID.l
  FileName.s[#MAX_PATH]
EndStructure 

   ;/On récupère la liste des fichiers présents sur le serveur FTP, au cas où il
    ; y en aurait à télécharger. Si c'est le cas, on en créé une liste.
    ; Ici, on liste tous les fichiers, mais on peut restreindre la liste par un filtre.
    ; On récupère par FTP, le premier de la liste qui corresponde au filtre.
    ; ***************************************************************************
    LShFindFile = FtpFindFirstFile_(File\hInternetConnect, "*.*", @PB_FIND_DATA, 0, 0)
    
    If LShFindFile
      ; Il y a au moins un fichier présent, on étudie ses caractéristiques.
      WriteStringN("On établi la liste des fichiers à télécharger depuis le serveur FTP.")
      While GetLastError_() <> #ERROR_NO_MORE_FILES And GetLastError_() <> #ERROR_FILE_NOT_FOUND
        
        ; On récupère les caractéristiques du fichier, que l'on met dans des variables.
        LSFileAttributes  = PeekL( @PB_FIND_DATA      )
        LSCreationTimeL   = PeekL( @PB_FIND_DATA + 4  )
        LSCreationTimeH   = PeekL( @PB_FIND_DATA + 8  )
        LSLastAccessTimeL = PeekL( @PB_FIND_DATA + 12 )
        LSLastAccessTimeH = PeekL( @PB_FIND_DATA + 16 )
        LSLastWriteTimeL  = PeekL( @PB_FIND_DATA + 20 )
        LSLastWriteTimeH  = PeekL( @PB_FIND_DATA + 24 )
        LSFileSizeHigh    = PeekL( @PB_FIND_DATA + 28 )
        LSFileSizeLow     = PeekL( @PB_FIND_DATA + 32 )
        LSOID             = PeekL( @PB_FIND_DATA + 36 )
        LSFileName        = PeekS( @PB_FIND_DATA + 44 )
        
        If #FILE_ATTRIBUTE_DIRECTORY & LSFileAttributes
          ; Si c'est un répertoire, on l'ignore.
        Else
          ; On ne conserve que le nom des fichiers .XML ou .BL ou .ACI ou .AR
          ExtensionFic = UCase(GetExtensionPart(Trim(LSFileName)))
          If ExtensionFic = "XML" Or ExtensionFic = "BL" Or ExtensionFic = "ACI" Or ExtensionFic = "AR"
            
            ; C'est un fichier et il nous interresse, on récupère ses caractéristiques.
            File\FileName      = Trim(LSFileName)                        ; Son nom.
            File\Bytes         = (LSFileSizeLow + 1024 * LSFileSizeHigh) ; Sa taille 
            File\FileSizeTotal = File\FileSizeTotal + File\Bytes ; Cumul de la taille des fichiers.
            File\FilesToGet    = File\FilesToGet + 1        ; Cumul du nombre de fichiers présents.
            
            AddGadgetItem(42, -1, File\FileName + Chr(10) + Str(File\Bytes))
          EndIf
          
        EndIf  
        ; Puis on récupère le fichier suivant dans le répertoire.
        InternetFindNextFile_(LShFindFile, @PB_FIND_DATA)
      Wend  ; Tant qu'il reste des fichiers.
      WriteStringN("Liste terminée.")
      InternetCloseHandle_(LShFindFile)
    Else
      ; Il n'y avait aucun fichier répondant au critère de sélection.
      File\FilesToGet = 0
    EndIf   
Voilà qui va te permettre d'avancer j'espère . . .

Dominique

Publié : ven. 05/nov./2004 18:12
par lazy

Code : Tout sélectionner

LShFindFile = FtpFindFirstFile_(File\hInternetConnect, "*.*", @PB_FIND_DATA, 0, 0)
The variable doesn't have a structure :/
Etant donné que tu as l'air de t'y connaitre, tu serais pas me dire ou je peux mettre ca dans mon code, car je l'avais deja eu sur un forum anglais mais je ne savais pas ou le mettre :oops:

Merci

Publié : ven. 05/nov./2004 19:09
par gansta93
le thread: CreateThread(@procedure(),paramaîtres)
Je ne sais plus quelle est ta procedure pour te connecter... dsl.
Une foie connecté... n'oublie pas KillThread(ThreadID) je suis pas sure.

Publié : sam. 06/nov./2004 11:37
par lazy
Merci bcp grace a vos conseil je suis arrivé a faire ske je voulais :D

Bien !

Publié : sam. 06/nov./2004 23:29
par DominiqueB
Content d'avoir pu aidé !

Penses à nous faire profiter de ton prog quand il sera fini, tes propres découvertes peuvent elles-aussi nous aider ou aider d'autres :-)

A+

Dominique