ReadTree Method
Class: FTP_SERVICE
This method retrieves a list of files and directories from the current directory on the FTP Server. The files and folders are placed in VFP cursor.
=
Object.ReadTree
Parameter
lcFolder
Input folder
Type Character
Direction Input
llChild
Flag if
Type Boolean
Direction Input
lcAlias
VFP cursor alias
Type Character
Direction Input
Holds an cursor of files and folders after the function completes.
The cursor has the following structure:
TypeNameDescription
M FolderLong file name if available
M NameLong file name if available
M AlterNameShort file name if available
N SizeSize of file in bytes
T CDFile create date and time
T LATLast access date and time
T LWTLast write date and time
C AttribFile attributes
Return value Boolean
Returns .T. if the function successfully returned content the current directory on the FTP Server. Returns .F. if the function could not get content the current directory.
Example
LOCAL loFTP,lii,lcAlias,lcAResult
LOCAL ARRAY laFolders(1)
#INCLUDE "ftp.h"
SET PROCEDURE TO ftp.prg ADDITIVE 
loFTP=CREATEOBJECT('ftp_service') 
lcAlias=SYS(2015)
lcAResult=SYS(2015)

IF loFTP.OpenInternet("ABONNE", "PWD", "10.10.10.10", "21")

   llNext=loFTP.ReadTree("",.T.,lcAlias)
   IF llNext
      SELECT PADR(folder+"/"+name,254),ALTERNAME M, SIZE, CD, LAT, LWT, ATTRIB FROM (lcAlias) INTO CURSOR (lcAResult)
      SELECT (lcAResult)
      BROWSE NORMAL
   ELSE
      ?loFTP.GetExtendedErrorCode(),loFTP.GetExtendedErrorMsg()
   ENDIF
   =loFTP.CloseInternet() 
ENDIF
IF USED(lcAlias)
   USE IN (lcAlias)
ENDIF
IF USED(lcAResult)
   USE IN (lcAResult)
ENDIF
RELEASE PROCEDURE ftp.prg
See also
Expand/Collapse source code of procedure ReadTree Source Code
      LPARAMETERS INP lcFolder, INP llChild, INP lcAlias
      LOCAL llNext,liRecno,lii,liCount
      LOCAL ARRAY laFiles(1)

      IF This.OpenFTPConnection()     && Open an FTP Handle
         =This.BeforeReadTree(lcFolder,llChild,lcAlias)
         IF USED(lcAlias)
            USE IN (lcAlias)
         ENDIF
         CREATE CURSOR (lcAlias)  (FOLDER M, NAME M, ALTERNAME M, SIZE I, CD T, LAT T, LWT T, ATTRIB M)

         llNext=IIF(!EMPTY(lcFolder),This.ChangeFTPDirectory(lcFolder),.T.)
         liCount=0
         llNext=llNext AND This.GetFTPDirectoryArray(@laFiles,"*.*",0,@liCount) && read all files and folders
         IF liCount>0
            FOR lii=1 TO ALEN(laFiles,1)
                INSERT INTO (lcAlias) (FOLDER, NAME, ALTERNAME, SIZE, CD, LAT, LWT, ATTRIB);
                  VALUES;
                  (This.cCurrentDir,laFiles(lii,1),laFiles(lii,2),laFiles(lii,3),laFiles(lii,4),laFiles(lii,5),laFiles(lii,6),laFiles(lii,7))
            NEXT

            SELECT (lcAlias)
            GO TOP
            SCAN WHILE llNext AND llChild
                 IF NOT ATTRIB=="D" 
                    LOOP
                 ENDIF   

                 liRecno=RECNO()

                 llNext=This.ChangeFTPDirectory(FOLDER+"/"+NAME)
                 llNext=llNext AND This.GetFTPDirectoryArray(@laFiles,"*.*",0,@liCount) && read all files and folders
                 IF liCount>0 
                    FOR lii=1 TO ALEN(laFiles,1)
                        INSERT INTO (lcAlias) (FOLDER, NAME, ALTERNAME, SIZE, CD, LAT, LWT, ATTRIB);
                           VALUES;
                           (This.cCurrentDir,laFiles(lii,1),laFiles(lii,2),laFiles(lii,3),laFiles(lii,4),laFiles(lii,5),laFiles(lii,6),laFiles(lii,7))
                    NEXT
                 ENDIF   

                 SELECT (lcAlias)
                 GO (liRecno)
            ENDSCAN 
         ENDIF

         =This.AfterReadTree(lcFolder,llChild,lcAlias,llNext)
         =IIF(This.lMultiOperations,.T.,This.CloseFTPConnection())   && Close FTP Handle
         RETURN llNext
      ENDIF
      RETURN .F.