[Gambas-user] ftp Client
Caveat
Gambas at ...1950...
Sat Sep 5 10:21:37 CEST 2009
Hi Lars,
Here's some code that should be enough to get you started. The code is
from a Gambas class which I called RequestManager. I have cut out some
of the code out as it wasn't relevant to FTP (there was stuff for doing
an HTTP GET and some code for querying services on a particular port).
ISTR there was some flakiness with the FTP client where it bombs out if
you send a blank (empty string) password, so if your FTP server doesn't
require one, just set the FTP client's password to "dummy" or something
and your FTP server *should* ignore it... failing that, you may have to
set a dummy password.
Note the difference between the local file name and the name of the file
you want to get off the server. The name of the file on the server is
normally included in the url set on FTPClient.URL (see the calling
instructions) and the name of the file on your local machine is passed
to the FTPClient.get method. If you want to PUT files on the FTP server
instead of GETting them, I'm sure you can adapt the code.
Bear in mind that getting a huge binary file as a string is probably not
a great idea. My getFileAsString method is really designed to work for
a small textual line-based file. You'll just need to wrap getFileByFTP
in a different way if you want to deal with binary or larger files.
Give me a shout if you get stuck or something is not clear.
Enough rambling... to use the code, just instantiate a new
RequestManager (or whatever you call the class) and use it as follows:
PRIVATE myRequestManager AS NEW RequestManager
...
DIM allData AS String
allData =
myRequestManager.getFileAsString("192.168.1.2//var/share/dvb2001/services.dat", "root", "password")
Now here follows (some of) the code for the RequestManager class itself:
' Gambas class file
PRIVATE theFTPClient AS NEW FtpClient
PRIVATE eggTimer AS NEW Timer
PRIVATE timedOut AS Boolean
PRIVATE busy AS Boolean
PRIVATE allStates AS Collection
PRIVATE SUB getFileByFTP(url AS String, userName AS String, password AS
String, localFile AS String)
DIM fileName AS String
theFTPClient.URL = url
theFTPClient.User = userName
theFTPClient.Password = password
secondsBeforeTimeout(10)
theFTPClient.get(localFile)
DO UNTIL theFTPClient.Status <= 0 OR timedOut = TRUE
Logger.logMessage("RequestManager.getFileByFTP() status: " &
theFTPClient.Status, FALSE)
WAIT 0.01
LOOP
IF theFTPClient.Status <> 0 THEN
message("Error in FTP call! Check password?")
END IF
busy = FALSE
CATCH
Logger.logMessage("getFileByFTP: " & Error.Text & " @ " & Error.Where,
TRUE)
END
PUBLIC FUNCTION getFileAsString(url AS String, userName AS String,
password AS String, tmpDir AS String) AS String
DIM result AS String
DIM fileName AS String
DIM hFile AS File
DIM aLine AS String
fileName = tmpDir &/ "drag_cont_tmp_" & userName & ".tmp"
Logger.logMessage("RequestManager.getFileAsString() fileName: " &
fileName, FALSE)
getFileByFTP(url, userName, password, fileName)
result = ""
OPEN fileName FOR READ AS #hFile
WHILE NOT Eof(hFile)
LINE INPUT #hFile, aLine
IF aLine <> NULL THEN
result = result & aLine & gb.NewLine
END IF
WEND
CLOSE #hFile
RETURN result
CATCH
Logger.logMessage("getFileByFTPAsString: " & Error.Text & " @ " &
Error.Where, TRUE)
END
PUBLIC SUB eggTimer_Timer()
eggTimer.Enabled = FALSE
timedOut = TRUE
Object.Detach(eggTimer)
END
PUBLIC FUNCTION isBusy() AS Boolean
Logger.logMessage("RequestManager checked for busy state and was: " &
booleanToString(busy), FALSE)
RETURN busy
END
PRIVATE SUB secondsBeforeTimeout(seconds AS Integer)
Object.Attach(eggTimer, ME, "eggTimer")
timedOut = FALSE
eggTimer.Delay = seconds * 1000
busy = TRUE
eggTimer.Enabled = TRUE
END
PRIVATE FUNCTION booleanToString(value AS Boolean) AS String
IF value THEN
RETURN "TRUE"
ELSE
RETURN "FALSE"
END IF
END
PRIVATE FUNCTION getState(aState AS Integer) AS String
RETURN getAllStates()[aState]
END
PRIVATE FUNCTION getAllStates() AS Collection
IF allStates = NULL THEN
allStates = NEW Collection
allStates.Add("Accepting", Net.Accepting)
allStates.Add("Active", Net.Active)
allStates.Add("CannotBindSocket", Net.CannotBindSocket)
allStates.Add("CannotCreateSocket", Net.CannotCreateSocket)
allStates.Add("CannotListen", Net.CannotListen)
allStates.Add("CannotRead", Net.CannotRead)
allStates.Add("CannotWrite", Net.CannotWrite)
allStates.Add("Connected", Net.Connected)
allStates.Add("Connecting", Net.Connecting)
allStates.Add("ConnectionRefused", Net.ConnectionRefused)
allStates.Add("HostNotFound", Net.HostNotFound)
allStates.Add("Inactive", Net.Inactive)
allStates.Add("Internet", Net.Internet)
allStates.Add("IPv4", Net.IPv4)
allStates.Add("Local", Net.Local)
allStates.Add("Pending", Net.Pending)
allStates.Add("ReceivingData", Net.ReceivingData)
allStates.Add("Searching", Net.Searching)
allStates.Add("Unix", Net.Unix)
END IF
RETURN allStates
END
On Thu, 2009-09-03 at 14:24 +0200, Lars Hoeger wrote:
> Hello,
>
> I would like to use the ftpclient component, but there is no documentation. Has anyone some code-examples?
>
> Thanks,
> Lars
> gambas 2.15
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now. http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
More information about the User
mailing list