Code archives/Networking/FTP Funcs
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Beta version of my FTP functions. At present only uses passive transfer mode. | |||||
;==================================================== ; FTP Function library Ver.1.00 29/10/02 ; ; Coded by Chevron ; ; Feel Free to use and adapt ; ; No restrictions on use, just give me a credit ; ; ; ; ; ; Credit goes to M.silby for the FTP_saveFile Func. ; ;==================================================== ;==================================================== ;If you need any help using these functions feel free ; to drop me a email at Steve@kreationsoftware.com ;---------------------------------------------------- ;Version History ;--------------- ;ver 1.00 ;--------- ; Initial Release. ;ver 1.01 ;-------- ; Fixed Log on bug ; Added runtime error on unable to acheive passive mode. ; Added optional progress indicator To upload transfer operation. ;ver 1.02 ;-------- ;Added optional progress indicator to download transfer operation ;Tweaked the progress indicator for better looks ;ver 1.03 ;-------- ;Added Chmod by request ;FOR ADVANCED USERS ONLY!! ;Not understanding the use of this function could render files un-readable!! ;-------------------- ;Functions Overview ;-------------------- ;FTP_Connect(ftp$,logon name$,Log on password$, logon account$) - connects To the ftp server ;FTP_List(dir$) - Downloads the directory list from ftp server and saves to a text file in local root directory. The dir$ parameter allows you to specifiy a directory to list, set to "" to list the parent. ;FTP_ParentDir() - Sets the Current FTP server directory to the parent directory. ;FTP_ChangeDir(Dir$) - Sets the current FTP server directory to the specified directory. ;FTP_Currentdir() - Returns the current working directory to the FTP_msg$. ;FTP_makedir() - Creates the specified directory. Note: Will return fail msg to FTP_msg$ if directory exsists. ;FTP_DelDir(dir$) - Deletes the passed remote directory. ;FTP_Delfile(file$) - Deletes the passed remote file. ;FTP_Rename(file1$,file2$) - Renames remote file1$ to file2$. Can also be used to rename directorys. ;FTP_Mode(code) - Sets the transfer mode. Pass 'I' for binary and 'A' for Ascil. ;FTP-ServerType() - Returns information about the current FTP server such as operating system e.t.c to FTP_msg$. ;FTP_Waitcode(code) - waits for the passed server response code, returns on error. ;FTP_Put(trans_file$,progress,x,y) - Uploads the passed file$. Simple progress indication (soon to be improved) can obtained by passing '1' to progress parameter.pass x,y coords for the position of the progress window. ;FTP_Get(Trans_file$,progress,x,y) - Downloads the passed file$.Simple progress indication (soon to be improved) can obtained by passing '1' to progress parameter.pass x,y coords for the position of the progress window. ;FTP_Filesize(file$) - Returns the passed remote file size in bytes to FTP_msg$. ;FTP_Help() - Returns the remote help file to FTP_help$. ;FTP_Quit() - Closes the FTP connection and associated streams. ;FTP_OpenData() - A sub-function used by other functions to open a data transfer stream to the ftp server in passive mode. ;FTP_SaveFile(Name$) - A sub-function used by other functions. ;FTP_Getmsg() - A sub_function used to check for incomming messages from the ftp server. ;FTP_Chmod(file$,user,group,other) - Set the passed file/directorys file attributes, use the table below to determine the required value. ; ;--------------------------------------------------- ; user group other(everyone else) ;--------------------------------------------------- ;readable 1 1 1 ;--------------------------------------------------- ;writeable 2 2 2 ;--------------------------------------------------- ;executable 4 4 4 ;--------------------------------------------------- ;add numbers To make a file attributes a cominnation of the above options ;eg To make it readable,writeable And executable pass 7 (1+2+4) ;---This Function is untested at present and I would appreiate some feedback if there is any problems----- ;-----you Must declare these as globals----- Global FTP$; Adress of the ftp server Global FTP_login$; your login name Global FTP_PASS$;your login password Global FTP_ACCT$;you login account(not required for most ftp accounts) Global FTP_msg$;returns command status and error messages from ftp server. Global ftpcom;ftp command stream Global FTP_data;ftp data stream Global FTP_code;returns the last reply code from the ftp server. Global transkbyte# ; returns the number of kbytes transfered in the last transfer. Global transtime# ; returns the time taken to perform the last transfer. Global transrate# ; returns the kbp's for the last data transfer. Global FTP_help$; holds the remote help file, after help command execution. Dim dp(6);used for 32bit ip address translations. ;----------------------------------------------------------------- ;------------------------------------------------------------- Function FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) ;------------------------------------------------------------- If ftpcom Then FTP_quit() ftpcom=OpenTCPStream( ftp$,21 ) If Not ftpcom RuntimeError( "FTP Connection Failed. Check your internet connection and retry" ) Repeat ;upload connection FTP_data FTP_getmsg() Select FTP_code Case 220 WriteLine ftpcom,"USER "+ftp_login$ Case 331 WriteLine ftpcom,"PASS "+ftp_pass$ Case 332 WriteLine ftpcom,"ACCT "+ftp_acct$ Case 530 RuntimeError "Log On Failed "+ftp_login$+" Cannot Log On" End Select Until FTP_code=230 FTP_Mode("I");select binary transfer mode End Function ;-------------------------------- Function FTP_list(dir$) ;-------------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) dir_list$="" open_data() WriteLine ftpcom,"LIST "+dir$ While ReadAvail(FTP_data)=0 Wend FTP_savefile("Dirlist.txt",0,0,0,0) CloseTCPStream FTP_data FTP_data=0 End Function ;------------------------------ Function FTP_ParentDir() ;------------------------------ If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"CDUP" FTP_waitcode(250) End Function ;--------------------------- Function FTP_Changedir(dir$) ;--------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"CWD "+dir$ FTP_waitcode(250) End Function ;---------------------------- Function FTP_Makedir(dir$) ;---------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"MKD "+dir$ FTP_waitcode(257) End Function ;---------------------------- Function FTP_DelDir(dir$) ;---------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"RMD "+Dir$ FTP_waitcode(250) End Function ;----------------------------- Function FTP_currentdir() ;----------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"PWD" FTP_waitcode(257) End Function ;----------------------------- Function FTP_DelFile(file$) ;----------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"DELE "+file$ FTP_waitcode(250) End Function ;----------------------------------- Function FTP_Rename(file1$,file2$) ;----------------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"RNFR "+file1$ FTP_waitcode(350) WriteLine ftpcom,"RNTO "+file2$ FTP_waitcode(250) End Function ;--------------------------------- Function FTP_filesize(file$) ;--------------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"SIZE "+file$ FTP_waitcode(213) End Function ;---------------------------- Function FTP_Mode(code$) ;---------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"TYPE "+code FTP_waitcode(200) End Function ;--------------------------- Function FTP_servertype() ;--------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"SYST" FTP_waitcode(200) End Function ;--------------------------- Function FTP_help() ;--------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"HELP" FTP_waitcode(211) FTP_help$=FTP_msg$ End Function ;--------------------------------- Function FTP_Put(Trans_file$,progress,x,y) ;--------------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) size#=1:time#=MilliSecs() If FileSize(trans_file$)=0 FTP_msg$="Error: Cannot Find Upload File!!" Return EndIf transfilesize#=FileSize(trans_file$) open_data() WriteLine ftpcom,"STOR "+trans_file$ file=ReadFile(trans_file$) rd=file:wt=FTP_data b=CreateBank(16384) Repeat If progress=True transpercent=100-(((transfilesize#-size#)/transfilesize#)*100) ftp_progressind(transpercent,trans_file$,1,x,y) EndIf n=ReadBytes( b,rd,0,16384) WriteBytes b,wt,0,n size#=size#+n Until n<>16384 transkbyte#=size/1000 transtime#=(MilliSecs()-time#)/1000 transrate#=transkbyte#/transtime# FreeBank b:CloseFile file:file=0:CloseTCPStream FTP_data:FTP_data=0 If progress=True transpercent=100 ftp_progressind(transpercent,trans_file$,2,x,y) EndIf End Function ;----------------------------- Function FTP_Get(Trans_file$,progressind,x,y) ;----------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) If progressind=1 ftp_filesize(Trans_file$) trans_fileSize#=Mid$(ftp_msg$,5) EndIf open_data() WriteLine ftpcom,"RETR "+trans_file$ While ReadAvail(FTP_data)=0 Wend FTP_Savefile(Trans_file$,1,x,y,trans_FileSize) CloseTCPStream FTP_data:FTP_data=0 End Function ;----------------------------- Function open_data() ;----------------------------- If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) trys=0 .retry WriteLine ftpcom,"PASV" FTP_waitcode(227) i1=Instr( FTP_msg$,"(" ) i2=Instr( FTP_msg$,")",i1 ) pt$=Mid$( FTP_msg$,i1+1,i2-i1-1 )+"," For k=1 To 6 i=Instr( pt$,"," ) dp(k)=Left$( pt$,i-1 ) pt$=Mid$(pt$,i+1) Next ip$=dp(1)+"."+dp(2)+"."+dp(3)+"."+dp(4) port=(dp(5)Shl 8)Or dp(6) FTP_data=OpenTCPStream(ip$,port) If Not FTP_data WriteLine ftpcom,"QUIT" FTP_waitcode(221) CloseTCPStream ftpcom:ftpcom=0 FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) trys=trys+1 If trys=5 Then RuntimeError("Unable to connect to FTP server "+ftp$+" in passive mode") Goto retry EndIf End Function ;-------------------------------------------------------- Function FTP_Savefile(filename$,cond,x,y,trans_filesize#) ;-------------------------------------------------------- time#=MilliSecs() size#=0 file=WriteFile(filename$) rd=FTP_data:wt=file b=CreateBank(16384) Repeat n=ReadBytes( b,rd,0,16384 ) WriteBytes b,wt,0,n size#=size#+n If cond=1 transpercent=100-(((trans_filesize#-size#)/trans_filesize#)*100) ftp_progressind(transpercent,filename$,3,x,y) EndIf Until n<>16384 transkbyte#=size/1000 transtime#=(MilliSecs()-time#)/1000 transrate#=transkbyte#/transtime# FreeBank b CloseFile file file=0 If cond=1 transpercent=100 ftp_progressind(transpercent,filename$,4,x,y) EndIf End Function ;---------------------------- Function FTP_Getmsg() ;---------------------------- FTP_code=0 FTP_msg$="" If ReadAvail(ftpcom)>0 Repeat Repeat FTP_msg$=ReadLine$(ftpcom) Until Len(FTP_msg$)>3 FTP_code=Left$(FTP_msg$,3 ) Until FTP_code>=100 And FTP_code<600 And Mid$(FTP_msg$,4,1 )=" " EndIf End Function ;------------------------------- Function FTP_waitcode(code) ;------------------------------- FTP_code=0 While FTP_code<>code FTP_getmsg() If KeyHit(1)=True Return;allow user to escape if trapped If FTP_code>400;error return Return EndIf Wend End Function ;------------------------------------------ Function FTP_Chmod(file$,user,group,other) ;------------------------------------------ If Not ftpcom Then FTP_connect(ftp$,FTP_login$,FTP_pass$,FTP_acct$) WriteLine ftpcom,"SITE CHMOD "+files$+" "+Str$(user)+Str$(group)+Str$(other) ftp_waitcode(200) End Function ;---------------------------- Function FTP_Quit() ;---------------------------- WriteLine ftpcom,"QUIT" ;FTP_waitcode(221) If ftpcom Then CloseTCPStream ftpcom:ftpcom=0 If FTP_data Then CloseTCPStream FTP_data:FTP_data=0 End Function ;------------------------------------------------------------ Function ftp_progressind(transpercent,trans_file$,status,x,y) ;------------------------------------------------------------ Cls Color 255,255,255 Rect x-1,y-1,301,141,0 Color 192,192,192 Rect x,y,300,140,1 For Y1=Y To Y+14 BLUE=255 For X1=X To X+298 Color 0,0,255-BLUE If BLUE>20 Then BLUE=BLUE-1 Plot X1,Y1 Next Next Color 0,0,0 Rect x+120,y+100,60,20,0 Line x+180,y+100,x+180,y+120 Line x+120,y+120,x+180,y+120 Text x+130,y+103,"ABORT" Rect x+45,y+60,200,20,1 Color 48,136,248 If transpercent<>100 For Y1=Y+61 To Y+79 Step 2 Line X+45,Y1,X+45+(TRANSPERCENT Shl 1),y1 Next Else Color 255,255,255 Locate x+75,y+64 Print "Operation Complete" EndIf Color 255,255,255 Locate x+5,y Print "FTP Transfer In Progress..." Locate x+5,y+35 If status=1 Color 0,0,0 Print "Uploading "+trans_file$+" to FTP Server" EndIf If status=2 Color 0,0,0 Print trans_file$+" Uploaded to FTP server" Locate x+42,y+82 Print Int(transkbyte#)+"Kb Uploaded at "+Int(transrate#)+" Kbps" Delay 1500 Return EndIf If status=3 Color 0,0,0 Print "Downloading "+trans_file$+" from FTP Server" EndIf If status=4 Color 0,0,0 Print trans_file$+" Downloaded from FTP server" Locate x+42,y+82 Print Int(transkbyte#)+"Kb Downloaded at "+Int(transrate#)+" Kbps" Delay 1500 Return EndIf Locate x+255,y+62 Print transpercent+"%" Flip End Function |
Comments
None.
Code Archives Forum