Wanna have FTP support for your code?
Here it is! Just for 0.99cents !!!
*EDIT*
Here's the windows library! (33kb)>>> HERE <<<
The Library includes source code and example project
*EDIT*
Code: Select all
; Code by Num3 - 2004
server_reply.s=Space(10240)
#ftp_port=21
#LFCR=Chr(13)+Chr(10)
#FTP_OK = 1
#FTP_ERROR = 0
#FTP_TimeOut = -1
Global FTP_Last_Message.s, ftp_data.l
Procedure Int_FTP_PASV(Ftp)
  
  Delay(100)
  SendNetworkString(Ftp,"PASV"+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      ;{ -- Retrieve Server IP and Data Port
      If FindString(In,"227",1)
        Argument$=Trim(In)
        startpos=FindString(Argument$, "(", 1)
        Position = FindString(Argument$, ",", 1)
        server_ip.s = Mid(Argument$, startpos+1, Position-1-startpos)+"."
        NewPosition = FindString(Argument$, ",", Position+1)
        server_ip= server_ip+Mid(Argument$, Position+1, NewPosition-Position-1)+"."
        Position = FindString(Argument$, ",", NewPosition+1)
        server_ip= server_ip+Mid(Argument$, NewPosition+1, Position-NewPosition-1)+"."
        NewPosition = FindString(Argument$, ",", Position+1)
        server_ip= server_ip+Mid(Argument$, Position+1, NewPosition-Position-1)
        server_ip = Trim(server_ip)
        ; Get the port..
        ;
        Position = FindString(Argument$, ",", NewPosition+1)
        ClientPort = Val(Mid(Argument$, NewPosition+1, Position-NewPosition-1)) << 8+Val(Right(Argument$, Len(Argument$)-Position))
        ;}
        
        ftp_data= OpenNetworkConnection(server_ip,ClientPort)
        
        If ftp_data
          ProcedureReturn #FTP_OK
        EndIf
        
      EndIf
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
EndProcedure
Procedure Int_FTP_PASV_CLOSE()
  CloseNetworkConnection(ftp_data)
  ftp_data=0
EndProcedure
Procedure.s FTP_Last_Message()
  ProcedureReturn FTP_Last_Message
EndProcedure
Procedure FTP_Init()
  If InitNetwork() 
    ProcedureReturn 1
  Else
    FTP_Last_Message="Unable to start TCP/IP stack..."
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure FTP_Connect(Server.s,Port.l) ; // Returns FTPconnection
  thread.l=OpenNetworkConnection(Server,Port)
  If thread
    ProcedureReturn thread
  Else
    FTP_Last_Message="Unable to connect to specified server..."
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure FTP_Login(Ftp.l,UserName.s,Password.s)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"USER "+UserName+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date()
      If now-time > 20 
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"331",1)
        time.l=Date()
        SendNetworkString(Ftp,"PASS "+Password+#LFCR)
      EndIf
      
      If FindString(In,"230",1)
        time.l=Date()
        SendNetworkString(Ftp,"TYPE A"+#LFCR)
        ProcedureReturn #FTP_OK
      EndIf
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
EndProcedure
Procedure FTP_LogOut(Ftp.l)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"QUIT"+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"221",1)
        time.l=Date()
        ProcedureReturn #FTP_OK
      EndIf
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
EndProcedure
Procedure FTP_Close(Ftp.l)
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
  If CloseNetworkConnection(Ftp)
    ProcedureReturn #FTP_OK
  Else
    FTP_Last_Message="Unable to close specified ftp connection"
    ProcedureReturn #FTP_ERROR
  EndIf
EndProcedure
Procedure FTP_List(Ftp.l)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
  If ftp_data=0
    If Int_FTP_PASV(Ftp)=0
      ProcedureReturn #FTP_ERROR
    EndIf
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"LIST"+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If ftp_data
      ftp_data_event=NetworkClientEvent(ftp_data)
    EndIf
    
    If ftp_data_event=2
      In.s=Space(48000)
      result=ReceiveNetworkData(ftp_data,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      Int_FTP_PASV_CLOSE()
      ProcedureReturn #FTP_OK
    EndIf
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      time.l=Date()
      
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
EndProcedure
Procedure FTP_Retrieve(Ftp.l,filename.s,Destination.s)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
  If ftp_data=0
    If Int_FTP_PASV(Ftp)=0
      ProcedureReturn #FTP_ERROR
    EndIf
  EndIf
  
  mem=AllocateMemory(64000)
  
  If CreateFile(0,Destination+filename)=0 And mem
    FTP_Last_Message="Unable to create file"
    CloseNetworkConnection(ftp_data)
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"RETR "+filename+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If ftp_data
      ftp_data_event=NetworkClientEvent(ftp_data)
    EndIf
    
    If ftp_data_event=2
      result=ReceiveNetworkData(ftp_data,mem,64000)
      If result>0
        WriteData(mem,result)
        Goto again:
      EndIf
      CloseFile(0) 
      FreeMemory(mem)
      Int_FTP_PASV_CLOSE()
      ProcedureReturn #FTP_OK
      again:
    EndIf
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"550",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
EndProcedure
Procedure FTP_CurrentDir(Ftp.l)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"PWD"+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"257",1)
        In=Trim(In)
        In=RemoveString(In,#LFCR)
        Position=FindString(In,"/",1)
        endposition=FindString(In,Chr(34),Position+3)-Position
        In=Mid(In,Position+1,endposition-1)
        FTP_Last_Message=In
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
  
EndProcedure
Procedure FTP_ChangeDir(Ftp.l,Dirname.s)
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"CWD "+Dirname+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"550",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"250",1)
        In=Trim(In)
        In=RemoveString(In,#LFCR)
        FTP_Last_Message=In
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
  
EndProcedure
Procedure FTP_Store(Ftp.l,filename.s)
  
  Block_size.l=4096
  
  If Ftp=0
    ProcedureReturn #FTP_ERROR
  EndIf
  
  
  If ftp_data=0
    If Int_FTP_PASV(Ftp)=0
      ProcedureReturn #FTP_ERROR
    EndIf
  EndIf
  
  file_size.l=FileSize(filename)
  
  If file_size>Block_size
    Blocks.l=file_size/Block_size
    Last_Block.l=file_size-(Block_size*Blocks)
  Else
    Blocks.l=1
    Block_size=file_size
  EndIf
  
  mem=AllocateMemory(Block_size)
  
  If OpenFile(0,filename)=0 And mem
    FTP_Last_Message="Unable to open file"
    CloseNetworkConnection(ftp_data)
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"STOR "+GetFilePart(filename)+#LFCR)
  time.l=Date()
  
  Repeat
    
    event=NetworkClientEvent(Ftp)
    
    If ftp_data
      ftp_data_event=NetworkClientEvent(ftp_data)
    EndIf
    
    If ftp_data_event=2
      result=ReceiveNetworkData(ftp_data,mem,Block_size)
      CloseFile(0) 
      FreeMemory(mem)
      Int_FTP_PASV_CLOSE()
      ProcedureReturn #FTP_OK
    EndIf
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      In=Trim(In)
      FTP_Last_Message=In
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"550",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"125",1)
        For a=1 To Blocks
          ReadData(mem,Block_size)
          SendNetworkData(ftp_data,mem,Block_size)
        Next
        
        If Last_Block>0
          ReadData(mem,Last_Block)
          SendNetworkData(ftp_data,mem,Last_Block)
        EndIf
        Int_FTP_PASV_CLOSE()
        
      EndIf
      
      If FindString(In,"226",1)
        CloseFile(0) 
        FreeMemory(mem)
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
EndProcedure
Procedure FTP_MakeDir(Ftp.l,Dirname.s)
  If Ftp=0 Or Dirname=""
    ProcedureReturn #FTP_ERROR
  EndIf
  
  Delay(100)
  SendNetworkString(Ftp,"MKD "+Dirname+#LFCR)
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"530",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      If FindString(In,"550",1)
        ProcedureReturn #FTP_OK
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"257",1)
        In=Trim(In)
        In=RemoveString(In,#LFCR)
        Position=FindString(In,"/",1)
        endposition=FindString(In,Chr(34),Position+3)-Position
        In=Mid(In,Position+1,endposition-1)
        FTP_Last_Message=In
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
  
EndProcedure
Procedure FTP_RemoveDir(Ftp.l,Dirname.s)
  
  If Ftp=0 Or Dirname=""
    ProcedureReturn #FTP_ERROR
  EndIf
  
  Delay(100)
  SendNetworkString(Ftp,"RMD "+Dirname+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"550",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"250",1)
        In=Trim(In)
        FTP_Last_Message=In
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
  
EndProcedure
Procedure FTP_Delete(Ftp.l, filename.s)
  
  If Ftp=0 Or filename=""
    ProcedureReturn #FTP_ERROR
  EndIf
  
    Delay(100)
  SendNetworkString(Ftp,"DELE "+filename+#LFCR)
  
  time.l=Date()
  
  Repeat
    event=NetworkClientEvent(Ftp)
    
    If event=0
      
      now=Date() 
      If now-time > 20 
        FTP_Last_Message="Time out"
        ProcedureReturn #FTP_TimeOut
      EndIf
      
    ElseIf event=2
      
      In.s=Space(10240)
      result=ReceiveNetworkData(Ftp,@In,Len(In))
      
      ;{ -- Analise data --
      
      ; -- Error Parsing
      If FindString(In,"550",1)
        ProcedureReturn #FTP_ERROR
      EndIf
      
      ; -- OK Parsing
      
      If FindString(In,"250",1)
        In=Trim(In)
        FTP_Last_Message=In
        ProcedureReturn #FTP_OK
      EndIf
      
      time.l=Date()
      
      ;}
      
    EndIf
    
    Delay(50)
    
  Until quit=1
  
  quit=0
  
  ProcedureReturn #FTP_OK 
  
EndProcedure
;/////////////////
;Example of usage
; Delays are needed to wait for server sync!!!
If FTP_Init()
  Com_port.l=FTP_Connect("yourserver",21)
  
  If Com_port
    If FTP_Login(Com_port,"yourlogin","yourpassword")
      Debug ">>> Login Sucessful"
      
      
      If FTP_MakeDir(Com_port,"test")
        Debug ">>> Directory created!"
      EndIf
      
      Delay(500)
      
      If FTP_ChangeDir(Com_port,"test")
        Debug ">>> Changed Directory"
      EndIf
      
      Delay(500)
      
      If FTP_CurrentDir(Com_port)
        Debug ">>> Current Directory:" + FTP_Last_Message()
      EndIf
      
      Delay(500)
      
      Debug ">>> Sending File "
      If FTP_Store(Com_port,"d:\casa.pdf")
        Debug ">>> File Uploaded..."
      EndIf
      
      Delay(500)
      
      If FTP_List(Com_port)
        Debug ">>> File List Has Follows..."
        Debug FTP_Last_Message()
      EndIf
      
      Delay(500)
      
      Debug ">>> Downloading File "
      If FTP_Retrieve(Com_port,"casa.pdf","e:\")
        Debug ">>> File Saved "
      Else
        Debug FTP_Last_Message()
      EndIf
      
      Delay(500)
      
      If FTP_Delete(Com_port,"casa.pdf")
        Debug ">>> File deleted!"
      EndIf
      
      If FTP_ChangeDir(Com_port,"..")
        Debug ">>> Changed Directory"
      EndIf
      
        
      If FTP_RemoveDir(Com_port,"test")
        Debug ">>> Directory deleted!"
      EndIf
      
      Delay(500)
      
      FTP_LogOut(Com_port)
    EndIf
    
    FTP_Close(Com_port)
  Else
    Debug FTP_Last_Message()
  EndIf
Else
  Debug FTP_Last_Message()
EndIf
End




