Mit FTP-Server verbinden?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Mit FTP-Server verbinden?

Beitrag 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:
BildBildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

@ts-soft: Wie verwende ich den Code (Also, wie muss ich die Funktionen ausrufen)? Ansonsten: Danke! :allright:
BildBildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

Und wie liste ich die Verzeichnise vom Server auf?
BildBildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

guck ins CodeArchiv, schreib ich jetzt nicht extra für Dich.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten