《求助》VFP程序中直接访问FTP服务器
我想在程序中直接访问FTP服务器!不要登录界面就执行FTP.TXT文件中的操作我还想在程序中设定一个时间定时系统
请高手可以指导一下吗?
ftp.txt清单
open 192.168.0.1 21
test
test
bin
prompt
get 测试.txt
bye
[此贴子已经被作者于2005-11-25 23:00:01编辑过]
传送命令到 ftp 上执行 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* Using FtpCommand * 传送命令到 FTP 上执行 *----------------------- Clea #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_SERVICE_FTP 1 #Define FTP_TRANSFER_TYPE_ASCII 1 #Define FTP_TRANSFER_TYPE_BINARY 2 Public hOpen, hFtpSession Do decl && declare external functions If connect2ftp ("202.105.49.131", "down", "down") *DO test1 *DO test2 Do test3 = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Endif Return && main Procedure test1 * 根目录清单 = execCmd (hFtpSession, "LIST", 1) Return Endproc Procedure test2 * 改变工作目录并显示 * 事实上,以下两个命令可以合并为: "LIST dmfiles" = execCmd (hFtpSession, "CWD dmfiles", 0) && 0 is important = execCmd (hFtpSession, "LIST", 1) Return Endproc Procedure test3 * 取回(下载)文件 * 保证该文件存在你的 FTP 上 = execCmd (hFtpSession, "CWD 红雨", 0) = execCmd (hFtpSession, "LIST", 1) = execCmd (hFtpSession, "MKD temptest", 0) = execCmd (hFtpSession, "RETR 日历控件.zip", 1) Return Endproc Function connect2ftp (strHost, strUser, strPwd) * open access to Inet functions hOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) If hOpen = 0 ? "找不到库 WinInet.Dll 的入口" Return .F. Endif * connect to FTP hFtpSession = InternetConnect (hOpen, strHost, INTERNET_INVALID_PORT_NUMBER,; strUser, strPwd, INTERNET_SERVICE_FTP, 0, 0) If hFtpSession = 0 * close access to Inet functions and exit = InternetCloseHandle (hOpen) ? "连接 FTP." + strHost + " 失败" Return .F. Else ? "连接到 " + strHost + " 用户: [" + strUser + "]密码:[" + strPwd + "]" Endif Return .T. Endfunc Function execCmd (hSession, lcCommand, fExpectResponse) * note that ASCII type is hard-coded hFile = 0 lnResult = FtpCommand (hFtpSession, fExpectResponse,; FTP_TRANSFER_TYPE_ASCII, lcCommand, 0, @hFile) If lnResult = 0 ? "命令执行错误: " + LTRIM(STR(GetLastError())) Return Endif If hFile <> 0 * if there is a return - display it on the screen Set MEMOWIDTH TO 100 lnBufsize = 128 && reading buffer size ? publ fileinfo fileinfo = chr(13)+chr(10) Do WHILE .T. lcBuffer = REPLI (Chr(0), lnBufsize) lnBytesRead = 0 If InternetReadFile (hFile, @lcBuffer, lnBufsize, @lnBytesRead) = 1 lcBuffer = LEFT(lcBuffer, lnBytesRead) ?? lcBuffer fileinfo = fileinfo + lcBuffer If lnBytesRead < lnBufsize Exit Endif Else Exit Endif Enddo = InternetCloseHandle (hFile) Endif Return Endfunc Procedure decl Declare INTEGER GetLastError IN kernel32 Declare INTEGER InternetOpen IN wininet; STRING sAgent,; INTEGER lAccessType,; STRING sProxyName,; STRING sProxyBypass,; STRING lFlags Declare INTEGER InternetCloseHandle IN wininet INTEGER hInet Declare INTEGER InternetConnect IN wininet; INTEGER hInternetSession,; STRING sServerName,; INTEGER nServerPort,; STRING sUsername,; STRING sPassword,; INTEGER lService,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FtpCommand IN wininet; INTEGER hConnect,; INTEGER fExpectResponse,; INTEGER dwFlags,; STRING lpszCommand,; STRING @ dwContext,; INTEGER @ phFtpCommand Declare INTEGER InternetReadFile IN wininet; INTEGER hFile,; STRING @ sBuffer,; INTEGER lNumBytesToRead,; INTEGER @ dwNumberOfBytesRead Return Endproc |
在指定 ftp 上创建目录 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* Creating a directory on the FTP * 在指定 FTP 上创建目录 *--------------------------------- Clea #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_SERVICE_FTP 1 #Define INTERNET_SERVICE_GOPHER 2 #Define INTERNET_SERVICE_HTTP 3 Do doDeclare * initialize access to Inet functions hOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) If hOpen = 0 ? "找不到库 WinInet.Dll 的入口" Return Endif * put FTP connection settings here strHost = "202.105.49.131" strUser = "down" strPwd = "down" * connect to the FTP hFtpSession = InternetConnect (hOpen, strHost, INTERNET_INVALID_PORT_NUMBER,; strUser, strPwd, INTERNET_SERVICE_FTP, 0, 0) If hFtpSession <> 0 mydir = "红雨" + SUBSTR(SYS(3),5) If FtpCreateDirectory (hFtpSession, mydir) = 1 ? "新的目录 " + mydir + " 创建成功" Else ? "不能创建新目录:" + mydir Endif Else ? "指定的 FTP 连接失败!!!" Endif * close FTP connection = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Procedure doDeclare Declare INTEGER InternetOpen IN "wininet.dll" ; STRING sAgent,; INTEGER lAccessType,; STRING sProxyName,; STRING sProxyBypass,; STRING lFlags Declare INTEGER InternetCloseHandle IN "wininet.dll" INTEGER hInet Declare INTEGER InternetConnect IN "wininet.dll" ; INTEGER hInternetSession,; STRING sServerName,; INTEGER nServerPort,; STRING sUsername,; STRING sPassword,; INTEGER lService,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FtpCreateDirectory IN "wininet.dll" ; INTEGER hFtpSession,; STRING lpszDirectory Endproc |
从 ftp 上删除指定文件 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* Deleting a file stored on the FTP server * 从 ftp 上删除指定文件 *------------------------------------------------- clea #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_SERVICE_FTP 1 #Define FTP_TRANSFER_TYPE_ASCII 1 #Define FTP_TRANSFER_TYPE_BINARY 2 Public hOpen, hFtpSession Do decl If connect2ftp ("202.105.49.131", "down", "down") * no wildcards accepted; valid file name only ? FtpDeleteFile (hFtpSession, "红雨/temptest.zip" ) = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Endif Procedure decl Declare INTEGER InternetOpen IN wininet.dll; STRING sAgent,; INTEGER lAccessType,; STRING sProxyName,; STRING sProxyBypass,; STRING lFlags Declare INTEGER InternetCloseHandle IN wininet.dll INTEGER hInet Declare INTEGER InternetConnect IN wininet.dll; INTEGER hInternetSession,; STRING sServerName,; INTEGER nServerPort,; STRING sUsername,; STRING sPassword,; INTEGER lService,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FtpDeleteFile IN wininet.dll; INTEGER hConnect,; STRING lpszFileName Return Endproc Function connect2ftp (strHost, strUser, strPwd) * open access to Inet functions hOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) If hOpen = 0 ? "找不到库 WinInet.Dll 的入口" Return .F. Endif * connect to FTP hFtpSession = InternetConnect (hOpen, strHost, INTERNET_INVALID_PORT_NUMBER,; strUser, strPwd, INTERNET_SERVICE_FTP, 0, 0) If hFtpSession = 0 * close access to Inet functions and exit = InternetCloseHandle (hOpen) ? "连接 FTP " + strHost + " 无效!!!" Return .F. Else ? "连接到 " + strHost + " as: [" + strUser + ", *****]" Endif Return .T. Endfunc |
从 ftp 上获得文件清单 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* Retrieving list of files on the FTP directory * 从 ftp 上获得文件清单 *-------------------------------------------- Clea #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_SERVICE_FTP 1 #Define FTP_TRANSFER_TYPE_ASCII 1 #Define FTP_TRANSFER_TYPE_BINARY 2 #Define INTERNET_FLAG_NEED_FILE 16 #Define FILE_ATTRIBUTE_DIRECTORY 16 Public hOpen, hFtpSession, arr Do decl If connect2ftp ("202.105.49.131", "down", "down") lcMask = "*" lcRemotePath = "." Dimen arr [1, 3] lnfiles = remoteDir2array (hFtpSession, lcRemotePath, lcMask, @arr) crea curs ftpfilelist (文件名 C(60), 文件大小 N(12), 文件时间 T) myfilelist = [] myfilelist = myfilelist + padr("文件名",60) + padr("文件大小",12) + padr("文件时间",24) + chr(13) + chr(10) For i = 1 to lnfiles insert into ftpfilelist (文件名, 文件大小, 文件时间) value (arr(i,1), arr(i,2), arr(i,3)) myfilelist = myfilelist ; + padr(arr(i,1),60) ; + padr(ByteSize( arr(i,2) ),12) ; + padr(ttoc(arr(i,3)),24) ; + chr(13) + chr(10) Endfor = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Endif _Cliptext = myfilelist Modi file sys(2015) nowa Keyboard '{CTRL+V}' Retu *------------------------------- Procedure decl Declare INTEGER InternetOpen IN wininet.dll; STRING sAgent,; INTEGER lAccessType,; STRING sProxyName,; STRING sProxyBypass,; STRING lFlags Declare INTEGER InternetCloseHandle IN wininet.dll INTEGER hInet Declare INTEGER InternetConnect IN wininet.dll; INTEGER hInternetSession,; STRING sServerName,; INTEGER nServerPort,; STRING sUsername,; STRING sPassword,; INTEGER lService,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FtpFindFirstFile IN wininet.dll; INTEGER hFtpSession,; STRING lpszSearchFile,; STRING @ lpFindFileData,; INTEGER dwFlags,; INTEGER dwContent Declare INTEGER InternetFindNextFile IN wininet.dll; INTEGER hFind,; STRING @ lpvFindData Declare INTEGER FtpGetCurrentDirectory IN wininet.dll; INTEGER hFtpSession,; STRING @ lpszDirectory,; INTEGER @ lpdwCurrentDirectory Declare INTEGER FtpSetCurrentDirectory IN wininet.dll; INTEGER hFtpSession,; STRING @ lpszDirectory Declare INTEGER FtpOpenFile IN wininet.dll; INTEGER hFtpSession,; STRING sFileName,; INTEGER lAccess,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FileTimeToSystemTime IN kernel32.dll; STRING @ lpFileTime,; STRING @ lpSystemTime *!* Declare INTEGER intShl IN win32vfp INTEGER nSource, INTEGER nShift && = bitlshift() *!* Declare INTEGER intShr IN win32vfp INTEGER nSource, INTEGER nShift && = bitrshift() *!* Declare INTEGER intAnd IN win32vfp INTEGER nInt0, INTEGER nInt1 && = bitand() *!* Declare INTEGER intXor IN win32vfp INTEGER nInt0, INTEGER nInt1 && = bitxor() *!* Declare INTEGER intOr IN win32vfp INTEGER nInt0, INTEGER nInt1 && = bitor() *!* Declare INTEGER intNot IN win32vfp INTEGER nInt && = bitnot() *!* Declare INTEGER buf2int IN win32vfp STRING @ lpBuffer && = buf2int() Return Endproc Function buf2int Parameters oldpc If type('oldpc')='N' lnBig = int(oldpc/256) lnSmall = oldpc - lnBig * 256 Retu alltrim(chr(lnSmall))+alltrim(chr(lnBig))+chr(0)+chr(0) Else lnresult = 0 lnlast = len(oldpc) For lni = 1 to lnlast lnresult = lnresult + asc(substr(oldpc, lni, 1)) * (256 ^ (lni - 1)) Endf lnmsb = (lnlast * 8) - 1 If bittest(lnresult, lnmsb) lnmax = (2 ^ (lnmsb + 1)) lnresult = lnresult - lnmax Endif Retu lnresult Endi Endfunc Function connect2ftp (strHost, strUser, strPwd) hOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) If hOpen = 0 && 打开 Inet 函数库 = messagebox( "找不到库 WinInet.Dll 的入口", 16, "红雨信息") Return .F. Endif hFtpSession = InternetConnect (hOpen, strHost, ; INTERNET_INVALID_PORT_NUMBER, strUser, strPwd, ; INTERNET_SERVICE_FTP, 0, 0) && 连接到 FTP If hFtpSession = 0 && 关闭 Inet 函数库,退出 = InternetCloseHandle (hOpen) = messagebox( "连接 FTP." + strHost + " 失败", 16, "红雨信息") Return .F. Else ? "连接到 " + strHost + " 用户名: [" + strUser + ", *****]" Endif Return .T. Endfunc Function setCurrentDir (hConnection, lcNewdir) Return FtpSetCurrentDirectory (hConnection, @lcNewdir) = 1 Endfunc Function getCurrentDir (hConnection) lcDirectory = SPACE(250) lnLen = Len(lcDirectory) If FtpGetCurrentDirectory (hConnection, @lcDirectory, @lnLen) = 1 Return LEFT(lcDirectory, lnLen) Else Return "" Endif Endfunc Function remoteDir2array (hConnection, lcRemotePath, lcMask, arr) * 将所有远程 ftp 上的文件描述赋值数组 lcStoredPath = getCurrentDir (hConnection) If Not setCurrentDir (hConnection, lcRemotePath) Return -1 && 路径没发现 Endif * 模拟 API 结构的对象 Struct = CREATEOBJECT ("struct_WIN32_FIND_DATA") * 找到第一个文件 lnFound = 0 lpFindFileData = REPLI (Chr(0), 320) hFind = FtpFindFirstFile (hConnection, lcMask, @lpFindFileData, INTERNET_FLAG_NEED_FILE, 0) If hFind <> 0 Do WHILE .T. Struct.setValue (lpFindFileData) If Not struct.isDirectory() lnFound = lnFound + 1 Dimen arr [lnFound, 3] arr [lnFound, 1] = struct.fileName arr [lnFound, 2] = struct.fileSizeLo arr [lnFound, 3] = struct.lastWriteTime Endif * 找下一个文件 If InternetFindNextFile (hFind, @lpFindFileData) <> 1 Exit Endif Enddo = InternetCloseHandle (hFind) Endif Release struct = setCurrentDir (hConnection, lcStoredPath) Return lnFound Endfunc Function ByteSize (dw) Declare STRING StrFormatByteSize IN Shlwapi; INTEGER dw,; STRING @ pszBuf,; INTEGER cchBuf pszBuf = SPACE(50) Retu StrFormatByteSize (m.dw, @pszBuf, Len(pszBuf)) Endfunc Define CLASS struct_WIN32_FIND_DATA As Custom * 模拟 WIN32_FIND_DATA 结构的类 Value = "" fileAttributes = 0 creationTimeLo = 0 creationTimeHi = 0 lastAccessTimeHi = 0 lastAccessTimeLo = 0 lastWriteTimeHi = 0 lastWriteTimeLo = 0 fileSizeLo = 0 fileName = "" creationTime = CTOT ("") lastAccessTime = CTOT ("") lastWriteTime = CTOT ("") Procedure setValue (lcValue) * 转换缓冲内容到对象属性 This.value = lcValue This.fileAttributes = THIS.buf2num (THIS.value, 0, 4) This.creationTimeLo = THIS.buf2num (THIS.value, 4, 4) This.creationTimeHi = THIS.buf2num (THIS.value, 8, 4) This.lastAccessTimeHi = THIS.buf2num (THIS.value, 12, 4) This.lastAccessTimeLo = THIS.buf2num (THIS.value, 16, 4) This.lastWriteTimeHi = THIS.buf2num (THIS.value, 20, 4) This.lastWriteTimeLo = THIS.buf2num (THIS.value, 24, 4) This.fileSizeLo = THIS.buf2num (THIS.value, 32, 4) This.creationTime = THIS.ftime2dtime (SUBSTR(THIS.value, 5, 8)) This.lastAccessTime = THIS.ftime2dtime (SUBSTR(THIS.value, 13, 8)) This.lastWriteTime = THIS.ftime2dtime (SUBSTR(THIS.value, 21, 8)) This.fileName = ALLTRIM(SUBSTR(THIS.value, 45,250)) If AT(Chr(0), THIS.fileName) <> 0 This.fileName = SUBSTR (THIS.fileName, 1, AT(Chr(0), THIS.fileName)-1) Endif Endproc Function isDirectory Return bitAnd (THIS.fileAttributes,FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Endfunc Protected FUNCTION buf2num (lcBuffer, lnOffset, lnBytes) * 从缓冲转换 bytes 到一个数值 lnResult = 0 For ii=1 TO lnBytes lnResult = lnResult +; bitlshift(Asc(SUBSTR (lcBuffer, lnOffset+ii, 1)), (ii-1)*8) Endfor Return lnResult Protected FUNCTION ftime2dtime (lcFileTime) lcSystemTime = REPLI (Chr(0), 16) = FileTimeToSystemTime (@lcFileTime, @lcSystemTime) wYear = THIS.buf2num (lcSystemTime, 0, 2) wMonth = THIS.buf2num (lcSystemTime, 2, 2) wDay = THIS.buf2num (lcSystemTime, 6, 2) wHour = THIS.buf2num (lcSystemTime, 8, 2) wMinute = THIS.buf2num (lcSystemTime, 10, 2) wSecond = THIS.buf2num (lcSystemTime, 12, 2) lcDate = STRTRAN (STR(wMonth,2) + "/" + STR(wDay,2) + "/" + STR(wYear,4), " ","0") lcTime = STRTRAN (STR(wHour,2) + ":" + STR(wMinute,2) + ":" + STR(wSecond,2), " ","0") lcStoredSet = SET ("DATE") Set DATE TO MDY ltResult = CTOT (lcDate + " " + lcTime) Set DATE TO &lcStoredSet Return ltResult Enddefine |
从 ftp 上下载文件 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* How to download a file from the FTP server using FtpGetFile * 使用 FtpGetFile 从 FTP 上下载文件 *-------------------------------------------------------------- Clea * lAccessType - some values #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_OPEN_TYPE_PROXY 3 #Define INTERNET_DEFAULT_FTP_PORT 21 * lFlags: only a few #Define INTERNET_FLAG_ASYNC 268435456 && &H10000000 #Define INTERNET_FLAG_FROM_CACHE 16777216 && &H1000000 #Define INTERNET_FLAG_OFFLINE 16777216 #Define INTERNET_FLAG_CACHE_IF_NET_FAIL 65536 && &H10000 * registry access settings #Define INTERNET_OPEN_TYPE_PRECONFIG 0 #Define FTP_TRANSFER_TYPE_ASCII 1 #Define FTP_TRANSFER_TYPE_BINARY 2 * type of service to access #Define INTERNET_SERVICE_FTP 1 #Define INTERNET_SERVICE_GOPHER 2 #Define INTERNET_SERVICE_HTTP 3 * file attributes #Define FILE_ATTRIBUTE_NORMAL 128 && 0x00000080 Do decl * you are free to choose any name, say "John Dow" * server-side variable $AGENT is the target sAgent = "hongyu" sProxyName = Chr(0) && I have no proxy sProxyBypass = Chr(0) && so there is nothing to bypass lFlags = 0 && no flags used * initialize access to Inet functions hOpen = InternetOpen (sAgent, INTERNET_OPEN_TYPE_DIRECT,; sProxyName, sProxyBypass, lFlags) If hOpen = 0 ? "找不到库 WinInet.Dll 的入口" Return Else ? "Wininet 句柄: " + LTRIM(STR(hOpen)) Endif * connection parameters - you better put your data strHost = "202.105.49.131" strUser = "down" strPwd = "down" * connecting to the FTP hFtpSession = InternetConnect (hOpen, strHost,; INTERNET_INVALID_PORT_NUMBER,; strUser, strPwd,; INTERNET_SERVICE_FTP, 0, 0) If hFtpSession = 0 * close access to Inet functions and exit = InternetCloseHandle (hOpen) ? "FTP " + strHost + " 无效" Return Else ? "连接到 " + strHost + " as: [" + strUser + ", *****]" ? "FTP 连接句柄: " + LTRIM(STR(hFtpSession)) Endif * downloading a file from the FTP * no check whether the target file exists lpszRemoteFile = "红雨/日历控件.zip" && if it still exists lpszNewFile = "C:\back\日历控件test.zip" && check the destination folder fFailIfExists = 0 && do not stop if the target already exists dwContext = 0 lnResult = FtpGetFile (hFtpSession, lpszRemoteFile, lpszNewFile,; fFailIfExists, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII,; dwContext) If lnResult # 1 ? "下载文件失败!" Endif * close handles = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Return && main Procedure decl Declare INTEGER InternetOpen IN wininet; STRING sAgent, INTEGER lAccessType, STRING sProxyName,; STRING sProxyBypass, STRING lFlags Declare INTEGER InternetCloseHandle IN wininet INTEGER hInet Declare INTEGER InternetConnect IN wininet; INTEGER hInternetSession, STRING sServerName,; INTEGER nServerPort, STRING sUsername,; STRING sPassword, INTEGER lService,; INTEGER lFlags, INTEGER lContext Declare INTEGER FtpGetFile IN wininet; INTEGER hFtpSession, STRING lpszRemoteFile,; STRING lpszNewFile, INTEGER fFailIfExists,; INTEGER dwFlagsAndAttributes,; INTEGER dwFlags, INTEGER dwContext Endproc |
|
|
上传文件到 ftp 上 |
-=-=-=-=-=-=-=-=-=-=-=-=-=- |
* 上传文件到 ftp 上 *------------------------------------------------ Clea #Define INTERNET_INVALID_PORT_NUMBER 0 #Define INTERNET_OPEN_TYPE_DIRECT 1 #Define INTERNET_SERVICE_FTP 1 #Define FTP_TRANSFER_TYPE_ASCII 1 #Define FTP_TRANSFER_TYPE_BINARY 2 Public hOpen, hFtpSession Do decl * select FTP connection providing you an appropriate access level * in all cases it can not be any "anonymous" access If connect2ftp ("202.105.49.131", "down", "down") * select the existing source and valid target file names * these names are as an example only lcSource = "E:\Hongyu\角色代理.prg" lcTarget = "红雨/temptest.txt" lcRenamed = "红雨/角色代理.prg" * default transfer type selected - * the file is transfered exactly as it is If FtpPutFile (hFtpSession, lcSource,; lcTarget, FTP_TRANSFER_TYPE_BINARY, 0) = 1 * if file (lcRenamed) already exists, most probably it would be replaced * with the new one during the renaming * at least my FTP server acts like this ? FtpRenameFile (hFtpSession, lcTarget, lcRenamed) Endif = InternetCloseHandle (hFtpSession) = InternetCloseHandle (hOpen) Endif Procedure decl Declare INTEGER InternetOpen IN wininet.dll; STRING sAgent,; INTEGER lAccessType,; STRING sProxyName,; STRING sProxyBypass,; STRING lFlags Declare INTEGER InternetCloseHandle IN wininet.dll INTEGER hInet Declare INTEGER InternetConnect IN wininet.dll; INTEGER hInternetSession,; STRING sServerName,; INTEGER nServerPort,; STRING sUsername,; STRING sPassword,; INTEGER lService,; INTEGER lFlags,; INTEGER lContext Declare INTEGER FtpPutFile IN wininet.dll; INTEGER hConnect,; STRING lpszLocalFile,; STRING lpszNewRemoteFile,; INTEGER dwFlags,; INTEGER dwContext Declare INTEGER FtpRenameFile IN wininet.dll; INTEGER hConnect,; STRING lpszExisting,; STRING lpszNew Return Endproc Function connect2ftp (strHost, strUser, strPwd) * open access to Inet functions hOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) If hOpen = 0 ? "找不到库 WinInet.Dll 的入口" Return .F. Endif * connect to FTP hFtpSession = InternetConnect (hOpen, strHost, INTERNET_INVALID_PORT_NUMBER,; strUser, strPwd, INTERNET_SERVICE_FTP, 0, 0) If hFtpSession = 0 * close access to Inet functions and exit = InternetCloseHandle (hOpen) ? "FTP " + strHost + " 无效" Return .F. Else ? "连接到 " + strHost + " as: [" + strUser + ", *****]" Endif Return .T. Endfunc |