Seite 1 von 3

Mit FTP-Server verbinden?

Verfasst: 02.02.2007 22:24
von Programie
Hi,

Wie kann ich mit einem PB-Programm mich mit einem FTP-Server (wie home.arcor.de) verbinden, die Verzeichnis-Informationen herunterladen und Dateien hoch/runterladen?

Danke im vorraus! :allright:

Verfasst: 02.02.2007 22:26
von ts-soft
Alles nötige im CodeArchiv. Ansonsten vielleicht die FTP-Lib von Paul, weiß
nicht, obs die auch auf PureArea gibt.

Hab gerade vor kurzen was dafür für mich erstellt:

Code: Alles auswählen

Enumeration 0
  #INTERNET_OPEN_TYPE_PRECONFIG
  #INTERNET_OPEN_TYPE_DIRECT
  #INTERNET_OPEN_TYPE_PROXY = 3
  #INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
EndEnumeration

Enumeration 1
  #INTERNET_SERVICE_FTP
  #INTERNET_SERVICE_GOPHER
  #INTERNET_SERVICE_HTTP
EndEnumeration

Enumeration 0
  #FTP_TRANSFER_TYPE_UNKNOWN
  #FTP_TRANSFER_TYPE_ASCII
  #FTP_TRANSFER_TYPE_BINARY
  #FTP_TRANSFER_TYPE_MASK  = (#FTP_TRANSFER_TYPE_ASCII|#FTP_TRANSFER_TYPE_BINARY)
EndEnumeration

#INTERNET_FLAG_RELOAD = $80000000

Procedure.l FTPInit(lpszAgent.s = "FTP", dwAccesType.l = #INTERNET_OPEN_TYPE_DIRECT, lpszProxyName.s = "", lpszProxyBypass.s = "", dwFlags.l = 0)
  ProcedureReturn InternetOpen_(@lpszAgent, dwAccesType, @lpszProxyName, @lpszProxyBypass, dwFlags)
EndProcedure

Procedure.l FTPConnect(hInternet.l, Server.s, User.s,  Password.s, port.l = 21)
  ProcedureReturn InternetConnect_(hInternet, @Server, port, User, @Password, #INTERNET_SERVICE_FTP, 0, 0)
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, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0) 
EndProcedure 

Procedure.l FTPUpload(hConnect.l, Source.s, Dest.s) 
  ProcedureReturn FtpPutFile_(hConnect, @Source, @Dest, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0) 
EndProcedure 

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

Procedure.l FTPRead2Mem(hConnect.l, File.s)
  Protected hFile.l, Mem.l, hSize.l, hSizeError.l, lpdwNumberOfBytesRead.l
  hFile = FtpOpenFile_(hConnect, @File, #GENERIC_READ, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0)
  hSize = FtpGetFileSize_(hFile, @hSizeError)
  If hSize > 0
    Mem = AllocateMemory(hSize)
    If Mem <> 0
      If InternetReadFile_(hFile, Mem, hSize, @lpdwNumberOfBytesRead)
        ProcedureReturn Mem
      Else
        FreeMemory(Mem)
        ProcedureReturn -1
      EndIf
    EndIf
  EndIf
EndProcedure

Verfasst: 02.02.2007 22:36
von Programie
@ts-soft: Wie verwende ich den Code (Also, wie muss ich die Funktionen ausrufen)? Ansonsten: Danke! :allright:

Verfasst: 02.02.2007 22:47
von ts-soft
Steht eigentlich alles bei o_O

Code: Alles auswählen

Url.s = "http://www.programie.de"
User.s = "programie"
Passwort.s = "Rumpelstilzchen"

hInternet = FTPInit()

If hInternet
  hConnect = FTPConnect(hInternet, Url, User,  Passwort)
  If hConnect
    If FTPSetDir(hConnect, "myproggies\test\")
      FTPDownload(hConnect.l, "test.zip", "c:\recycled\test.zip") 
    EndIf
    FTPClose(hConnect)
  EndIf
  FTPClose(hInternet)
EndIf

Verfasst: 02.02.2007 22:50
von Programie
Und wie liste ich die Verzeichnise vom Server auf?

Verfasst: 02.02.2007 22:52
von ts-soft
guck ins CodeArchiv, schreib ich jetzt nicht extra für Dich.

Verfasst: 03.02.2007 07:30
von dysti

Verfasst: 03.02.2007 12:15
von DarkDragon

Verfasst: 03.02.2007 14:48
von mk-soft
Hi,
Echt klasse von ts-soft :allright:

Habe das ma mit Zwei Funktionen erweitern.

FTPGetDir(hConnect)
FTPListDir(hConnect, Direction, List.FIND_DATA())

Code: Alles auswählen

;-TOP
; Kommentar     : 
; Author        : ts-soft
; Second Author : mk-soft
; Datei         : FTPHelper.pb
; Version       : 1.01
; Erstellt      : ???
; Geändert      : 03.01.2007
; 
; Compilermode  :
;
; ***************************************************************************************


Enumeration 0
  #INTERNET_OPEN_TYPE_PRECONFIG
  #INTERNET_OPEN_TYPE_DIRECT
  #INTERNET_OPEN_TYPE_PROXY = 3
  #INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
EndEnumeration

Enumeration 1
  #INTERNET_SERVICE_FTP
  #INTERNET_SERVICE_GOPHER
  #INTERNET_SERVICE_HTTP
EndEnumeration

Enumeration 0
  #FTP_TRANSFER_TYPE_UNKNOWN
  #FTP_TRANSFER_TYPE_ASCII
  #FTP_TRANSFER_TYPE_BINARY
  #FTP_TRANSFER_TYPE_MASK  = (#FTP_TRANSFER_TYPE_ASCII|#FTP_TRANSFER_TYPE_BINARY)
EndEnumeration

#INTERNET_FLAG_RELOAD = $80000000

Structure FIND_DATA
  dwFileAttributes.l
  ftCreationTime.FILETIME
  ftLastAccessTime.FILETIME
  ftLastWriteTime.FILETIME
  nFileSizeHigh.l
  nFileSizeLow.l
  dwReserved0.l
  dwReserved1.l
  cFileName.s{260}
  cAlternate.s{14}
  dummy.w
EndStructure


Procedure.s FormatMessage(ErrorNumber.l)

  Protected len
  
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@Buffer,0,0)
  If len
    ProcedureReturn PeekS(Buffer, len - 2)
    LocalFree_(Buffer)
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
  EndIf
  
EndProcedure


Procedure.l FTPInit(lpszAgent.s = "FTP", dwAccesType.l = #INTERNET_OPEN_TYPE_DIRECT, lpszProxyName.s = "", lpszProxyBypass.s = "", dwFlags.l = 0)
  ProcedureReturn InternetOpen_(@lpszAgent, dwAccesType, @lpszProxyName, @lpszProxyBypass, dwFlags)
EndProcedure

Procedure.l FTPConnect(hInternet.l, Server.s, User.s,  Password.s, port.l = 21)
  ProcedureReturn InternetConnect_(hInternet, @Server, port, User, @Password, #INTERNET_SERVICE_FTP, 0, 0)
EndProcedure

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

Procedure.s FTPGetDir(hConnect.l)

  Protected temp.s, Size.l
  
  temp = Space(#MAX_PATH)
  Size = #MAX_PATH
  If FtpGetCurrentDirectory_(hConnect, @Temp, @Size)
    ProcedureReturn temp
  Else
    ProcedureReturn ""
  EndIf
EndProcedure

Procedure FTPListDir(hConnect, Dir.s, List.FIND_DATA())

  Protected hResult.l, Result.FIND_DATA
  
  ClearList(List())
  hResult = FtpFindFirstFile_(hConnect, @Dir, Result, #INTERNET_FLAG_RELOAD, 0)
  If hResult
    AddElement(List())
    CopyMemory(Result, @List(), SizeOf(FIND_DATA))
    While InternetFindNextFile_(hResult, Result)
      AddElement(List())
      CopyMemory(Result, @List(), SizeOf(FIND_DATA))
    Wend
    CloseHandle_(hResult)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
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, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0)
EndProcedure

Procedure.l FTPUpload(hConnect.l, Source.s, Dest.s)
  ProcedureReturn FtpPutFile_(hConnect, @Source, @Dest, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0)
EndProcedure

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

Procedure.l FTPRead2Mem(hConnect.l, File.s)
  Protected hFile.l, Mem.l, hSize.l, hSizeError.l, lpdwNumberOfBytesRead.l
  hFile = FtpOpenFile_(hConnect, @File, #GENERIC_READ, #FTP_TRANSFER_TYPE_BINARY | #INTERNET_FLAG_RELOAD, 0)
  hSize = FtpGetFileSize_(hFile, @hSizeError)
  If hSize > 0
    Mem = AllocateMemory(hSize)
    If Mem <> 0
      If InternetReadFile_(hFile, Mem, hSize, @lpdwNumberOfBytesRead)
        ProcedureReturn Mem
      Else
        FreeMemory(Mem)
        ProcedureReturn -1
      EndIf
    EndIf
  EndIf
EndProcedure


; Test Beispiel

Global NewList Files.FIND_DATA()

hInternet = FTPInit()
If hInternet = 0
  Debug "Error: Init"
  End
EndIf

hConnect = FTPConnect(hInternet, "ftp.avm.de", "", "")

If hConnect = 0
  Debug "Error: Connet"
  End
EndIf

If FTPListDir(hConnect, "", Files()) = 0
  Debug FormatMessage(GetLastError_())
  FTPClose(hInternet)
  End  
EndIf

ForEach Files()
  With Files()
    Debug \cFileName
  EndWith
Next

FTPClose(hInternet)

FF :allright: :wink:

Verfasst: 03.02.2007 15:18
von ts-soft
@mk-soft
Hat es einen Grund, das Du nicht die bereits definierte Structure nimmst?
"WIN32_FIND_DATA"
Ansonsten erstmal danke für die Erweiterung :allright: