CrackFile Method
Class: FTP_SERVICE
Internal method for parsing file's attributes and storing to array.
=
Object.CrackFile
Parameter
lcString
FtpFindFirstFile/FtpNextFirstFile
Type Character
Direction Input
laDirectory
Array of files
Type Array
By reference  
Direction Input/Output
Holds an array of files after the function completes.
Return value Boolean
The return value is always .T.
Example
See source code of method FTP_SERVICE::GetFTPDirectoryArray()
See also
Expand/Collapse source code of procedure CrackFile Source Code
LPARAMETERS INP lcString, CHNGREF laDirectory
      LOCAL lcFileName, lcAlterName, lnSizeHigh, lnSizeLow, lnFileSize, ;
            lcAttributes, lnArrayLen, lcTimeBuff, ;
            ldCreateDate, ldAccessDate, ldWriteDate, laNewArray, lnResult,lcPom

      IF TYPE('laDirectory[1, 1]') = 'L'    && Array Has Not Been Filed      
         * Force Record size of 1
         DIMENSION laDirectory [1, 7]
      ELSE    
         * Expand Array
         DIMENSION laDirectory [ALEN(laDirectory, 1) + 1, 7]
      ENDIF

      * Get new Array Position
      lnArrayLen = ALEN(laDirectory, 1)


*!* 4      DWORD    dwFileAttributes; 
*!* 8      FILETIME ftCreationTime; 
*!*    8      FILETIME ftLastAccessTime; 
*!* 8      FILETIME ftLastWriteTime; 
*!* 4      DWORD    nFileSizeHigh; 
*!* 4      DWORD    nFileSizeLow; 
*!* 4      DWORD    dwReserved0; 
*!* 4      DWORD    dwReserved1; 
*!* 4      TCHAR    cFileName[ MAX_PATH ]; 
*!*      TCHAR    cAlternateFileName[ 14 ]; 


*!*    typedef struct _FILETIME { 
*!*        DWORD dwLowDateTime; 
*!*        DWORD dwHighDateTime; 
*!*    } FILETIME, *PFILETIME; 



      lcFileName = SUBSTR(lcString, 45, MAX_PATH)
      lcAlterName = RIGHT(lcString, 14)

      lcFileName = LEFT(lcFileName, AT(cNull, lcFileName) - 1)  && Copy out just the File Name Text
      lcAlterName = LEFT(lcAlterName, AT(cNull, lcAlterName) - 1)

      * Convert File Size DWORDs
      lnSizeHigh = (ASC(SUBSTR(lcString, 29, 1)) * BYTE_1) + ;
                   (ASC(SUBSTR(lcString, 30, 1)) * BYTE_2) + ;
                   (ASC(SUBSTR(lcString, 31, 1)) * BYTE_3) + ;
                   (ASC(SUBSTR(lcString, 32, 1)) * BYTE_4) 

      lnSizeLow =  (ASC(SUBSTR(lcString, 33, 1)) * BYTE_1) + ;
                   (ASC(SUBSTR(lcString, 34, 1)) * BYTE_2) + ;
                   (ASC(SUBSTR(lcString, 35, 1)) * BYTE_3) + ;
                   (ASC(SUBSTR(lcString, 36, 1)) * BYTE_4) 

      * Build File Size
      lnFileSize = (lnSizeHigh * MAXDWORD) + lnSizeLow

      *!* FtpGetFileSize does NOT work as expected for files greater then 4Gb (dwFileSizeHigh always NULL)
      *!* http://groups.google.com.ar/group/microsoft.public.windows.inetexplorer.ie5.programming.wininet/browse_thread/thread/3c118ed4c7c32269/791a868311e60a00?lnk=st&q=ftpfindfirstfile+and+large+files&rnum=2&hl=es#791a868311e60a00

      * Convert File Date

      * Get File Create DateTime
      lcTimeBuff = SUBSTR(lcString, 5, 8)
      ldCreateDate = This.CrackDate(lcTimeBuff)

      * Get File Last Access DateTime
      lcTimeBuff = SUBSTR(lcString, 13, 8)
      ldAccessDate = This.CrackDate(lcTimeBuff)

      * Get File Last Write DateTime
      lcTimeBuff = SUBSTR(lcString, 21, 8)
      ldWriteDate = This.CrackDate(lcTimeBuff)

      * Get File Attributes
      lcAttributes = This.CrackAttributes(LEFT(lcString, 4))

      laDirectory[lnArrayLen, 1] = ALLTRIM(lcFileName)
      laDirectory[lnArrayLen, 2] = ALLTRIM(lcAlterName)
      laDirectory[lnArrayLen, 3] = lnFileSize
      laDirectory[lnArrayLen, 4] = ldCreateDate
      laDirectory[lnArrayLen, 5] = ldAccessDate
      laDirectory[lnArrayLen, 6] = ldWriteDate
      laDirectory[lnArrayLen, 7] = lcAttributes

      RETURN