>#define INTERNET_FLAG_PASSIVE 0x08000000 > >PROCEDURE Init(lcHost, lcUser, lcPwd) > THIS.hInternet = InternetOpen("VfpFtp", INTERNET_OPEN_TYPE_DIRECT, 0,0,0) > IF THIS.hInternet <> 0 > THIS.hConnect = InternetConnect(THIS.hInternet, lcHost,; > INTERNET_INVALID_PORT_NUMBER, lcUser, lcPwd,; > INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0) > ENDIF > IF THIS.hConnect = 0 > RETURN .F. > ENDIF >>
>>>#DEFINE ERROR_FTP_TRANSFER_IN_PROGRESS 12110 >>>#DEFINE INTERNET_OPEN_TYPE_DIRECT 1 >>>#DEFINE INTERNET_SERVICE_FTP 1 >>>#DEFINE INTERNET_INVALID_PORT_NUMBER 0 >>> >>>DO declare >>> >>>LOCAL oFtp >>> >>>* replace Init parameters with valid host, user and password >>>* for a FTP server >>> >>>oFtp = CREATEOBJECT("TFtpDir",; >>> "ftp.???.???", "anonymous", "ano@nymous.com") >>> >>>IF TYPE("oFtp") = "O" >>> oFtp.ScanFiles >>>ENDIF >>>* end of main >>> >>>DEFINE CLASS TFtpDir As Custom >>>hInternet=0 >>>hConnect=0 >>> >>>PROCEDURE Init(lcHost, lcUser, lcPwd) >>> THIS.hInternet = InternetOpen("VfpFtp", INTERNET_OPEN_TYPE_DIRECT, 0,0,0) >>> IF THIS.hInternet <> 0 >>> THIS.hConnect = InternetConnect(THIS.hInternet, lcHost,; >>> INTERNET_INVALID_PORT_NUMBER, lcUser, lcPwd,; >>> INTERNET_SERVICE_FTP, 0, 0) >>> ENDIF >>> IF THIS.hConnect = 0 >>> RETURN .F. >>> ENDIF >>> >>>PROCEDURE Destroy >>> InternetCloseHandle(THIS.hConnect) >>> InternetCloseHandle(THIS.hInternet) >>> >>>PROCEDURE ScanFiles >>> THIS.EnumFiles >>> >>> WITH THIS >>> DO WHILE .T. >>> lnResult = .NextNode() >>> DO CASE >>> CASE lnResult = 0 >>> LOOP >>> CASE lnResult = 1 >>> .EnumFiles >>> CASE lnResult = -1 >>> EXIT >>> ENDCASE >>> ENDDO >>> ENDWITH >>> >>>FUNCTION NextNode >>>* returns next unprocessed remote folder >>> SELECT csResult >>> LOCATE ALL FOR Not processed >>> >>> IF FOUND() >>> IF FtpSetCurrentDirectory(THIS.hConnect, ALLTRIM(csResult.fpath)) <> 1 >>> REPLACE processed WITH .T., accesserr WITH .T. >>> RETURN 0 >>> ELSE >>> RETURN 1 >>> ENDIF >>> ELSE >>> RETURN -1 >>> ENDIF >>> >>>PROTECTED FUNCTION GetCurrentDir >>> DECLARE INTEGER FtpGetCurrentDirectory IN wininet; >>> INTEGER hFtpSession, STRING @lpszDir, INTEGER @lpdwCurDir >>> LOCAL lcDirectory, lnLen, lnResult >>> lcDirectory = SPACE(250) >>> lnLen = Len(lcDirectory) >>> lnResult = FtpGetCurrentDirectory(THIS.hConnect, @lcDirectory, @lnLen) >>>RETURN Iif(lnResult=1, LEFT(lcDirectory, lnLen), "#error#") >>> >>>PROCEDURE EnumFiles >>>#DEFINE FILE_ATTR_DIR 16 >>>#DEFINE MAX_PATH 260 >>>#DEFINE MAX_DWORD 0xffffffff + 1 >>>#DEFINE FIND_DATA_SIZE 318 >>>#DEFINE INTERNET_FLAG_NEED_FILE 16 >>> >>> LOCAL lcFPath >>> lcFPath = THIS.GetCurrentDir() >>> >>> IF Not USED("csResult") >>> CREATE CURSOR csResult (; >>> fpath C(250),; >>> fileattr I,; >>> filecount I,; >>> dircount I,; >>> filesize N(12),; >>> isfile L,; >>> processed L,; >>> accesserr L ) >>> >>> INSERT INTO csResult VALUES (; >>> lcFPath, 0,0,0,0, .F., .F., .F.) >>> ENDIF >>> ? lcFPath >>> >>> LOCAL hFind, lcFBuff, lnFileattr, lcFilename, lnFileCount, lnDirCount,; >>> lnFileSize, lProcessed, lIsFile >>> >>> STORE 0 TO lnDirCount, lnFileCount, lnFileSize >>> lcFBuff = Repli(Chr(0), FIND_DATA_SIZE) >>> >>> hFind = FtpFindFirstFile(THIS.hConnect, lcFPath + "/*.*",; >>> @lcFBuff, INTERNET_FLAG_NEED_FILE, 0) >>> >>> IF hFind <> 0 >>> DO WHILE .T. >>> lcFilename = SUBSTR(lcFBuff, 45,MAX_PATH) >>> lcFilename = Left(lcFilename, AT(Chr(0),lcFilename)-1) >>> lnFileattr = buf2dword(SUBSTR(lcFBuff, 1,4)) >>> lnFileSize = buf2dword(SUBSTR(lcFBuff, 29,4)) * MAX_DWORD +; >>> buf2dword(SUBSTR(lcFBuff, 33,4)) >>> >>> IF BitAnd(lnFileattr, FILE_ATTR_DIR) = FILE_ATTR_DIR >>> * for a directory >>> lnDirCount = lnDirCount + 1 >>> lProcessed = (lcFilename==".." Or lcFilename==".") >>> lIsFile = .F. >>> ELSE >>> * for a regular file >>> lnFileCount = lnFileCount + 1 >>> lProcessed = .T. >>> lIsFile = .T. >>> ENDIF >>> >>> lcFullpath = lcFPath + "/" + lcFilename >>> lcFullpath = STRTRAN(lcFullpath, "//", "/") >>> >>> INSERT INTO csResult VALUES (lcFullpath,; >>> lnFileattr, 0, 0, lnFilesize, lIsFile, lProcessed, .F.) >>> >>> IF InternetFindNextFile(hFind, @lcFBuff) = 0 >>> EXIT >>> ENDIF >>> ENDDO >>> ENDIF >>> >>> UPDATE csResult SET dircount = m.lnDirCount,; >>> filecount = m.lnFileCount, filesize = m.lnFileSize,; >>> processed = .T.; >>> WHERE fpath == lcFPath >>> >>> = InternetCloseHandle(hFind) >>>ENDDEFINE >>> >>>FUNCTION buf2dword(cBuffer) >>>RETURN Asc(SUBSTR(cBuffer, 1,1)) + ; >>> BitLShift(Asc(SUBSTR(cBuffer, 2,1)), 8) +; >>> BitLShift(Asc(SUBSTR(cBuffer, 3,1)), 16) +; >>> BitLShift(Asc(SUBSTR(cBuffer, 4,1)), 24) >>> >>>PROCEDURE declare >>> DECLARE INTEGER InternetCloseHandle IN wininet INTEGER hInet >>> >>> DECLARE INTEGER InternetOpen IN wininet; >>> STRING sAgent, INTEGER lAccessType, STRING sProxyName,; >>> STRING sProxyBypass, STRING lFlags >>> >>> DECLARE INTEGER InternetConnect IN wininet; >>> INTEGER hInternetSession, STRING sServerName, INTEGER nServerPort,; >>> STRING sUsername, STRING sPassword, INTEGER lService,; >>> INTEGER lFlags, INTEGER lContext >>> >>> DECLARE INTEGER FtpFindFirstFile IN wininet; >>> INTEGER hFtpSession, STRING lpszSearchFile,; >>> STRING @lpFindFileData, INTEGER dwFlags, INTEGER dwContent >>> >>> DECLARE INTEGER InternetFindNextFile IN wininet; >>> INTEGER hFind, STRING @lpvFindData >>> >>> DECLARE INTEGER FtpSetCurrentDirectory IN wininet; >>> INTEGER hFtpSession, STRING @lpszDirectory >>>