CrackFile Method
Class: FTP_SERVICE
Description:Parsing file's attributes and storing to array
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('m.laDirectory[1, 1]') = 'L'    && Array Has Not Been Filed      
         * Force Record size of 1
         DIMENSION m.laDirectory [1, 7]
      ELSE    
         * Expand Array
         DIMENSION m.laDirectory [ALEN(m.laDirectory, 1) + 1, 7]
      ENDIF
            
      * Get new Array Position
      lnArrayLen = ALEN(m.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(m.lcString, 45, MAX_PATH)
      lcAlterName = RIGHT(m.lcString, 14)
              
      lcFileName = LEFT(m.lcFileName, AT(cNull, m.lcFileName) - 1)  && Copy out just the File Name Text
      lcAlterName = LEFT(m.lcAlterName, AT(cNull, m.lcAlterName) - 1)
              
      * Convert File Size DWORDs
      lnSizeHigh = (ASC(SUBSTR(m.lcString, 29, 1)) * BYTE_1) + ;
                   (ASC(SUBSTR(m.lcString, 30, 1)) * BYTE_2) + ;
                   (ASC(SUBSTR(m.lcString, 31, 1)) * BYTE_3) + ;
                   (ASC(SUBSTR(m.lcString, 32, 1)) * BYTE_4) 
                           
      lnSizeLow =  (ASC(SUBSTR(m.lcString, 33, 1)) * BYTE_1) + ;
                   (ASC(SUBSTR(m.lcString, 34, 1)) * BYTE_2) + ;
                   (ASC(SUBSTR(m.lcString, 35, 1)) * BYTE_3) + ;
                   (ASC(SUBSTR(m.lcString, 36, 1)) * BYTE_4) 
                           
      * Build File Size
      lnFileSize = (m.lnSizeHigh * MAXDWORD) + m.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(m.lcString, 5, 8)
      ldCreateDate = This.CrackDate(m.lcTimeBuff)
            
      * Get File Last Access DateTime
      lcTimeBuff = SUBSTR(m.lcString, 13, 8)
      ldAccessDate = This.CrackDate(m.lcTimeBuff)
            
      * Get File Last Write DateTime
      lcTimeBuff = SUBSTR(m.lcString, 21, 8)
      ldWriteDate = This.CrackDate(m.lcTimeBuff)
            
      * Get File Attributes
      lcAttributes = This.CrackAttributes(LEFT(m.lcString, 4))
            
      laDirectory[m.lnArrayLen, 1] = ALLTRIM(m.lcFileName)
      laDirectory[m.lnArrayLen, 2] = ALLTRIM(m.lcAlterName)
      laDirectory[m.lnArrayLen, 3] = m.lnFileSize
      laDirectory[m.lnArrayLen, 4] = m.ldCreateDate
      laDirectory[m.lnArrayLen, 5] = m.ldAccessDate
      laDirectory[m.lnArrayLen, 6] = m.ldWriteDate
      laDirectory[m.lnArrayLen, 7] = m.lcAttributes
       
      RETURN