VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

FTP上/下傳範例(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期日 五月 04, 2003 3:08 pm    文章主題: FTP上/下傳範例(轉貼) 引言回覆

FTP上傳範例(轉貼)


代碼:

 RELEASE SZ_FTP
 PUBLIC SZ_FTP
 SZ_FTP = CREATEOBJECT('ftp_service')
 RETURN

PROCEDURE ListDir
 LOCAL LCOUTPUT , LCDIRNAME , LADIRARRAY
 LADIRARRAY = ''
 IF  .NOT. SZ_FTP.GETFTPDIRECTORY(@LCDIRNAME)
     SZ_FTP.GETERRORCODE(.T.)
    LCDIRNAME = ''
 ENDIF
 IF  .NOT. SZ_FTP.GETFTPDIRECTORYARRAY(@LADIRARRAY,'*.*')
    IF  .NOT. EMPTY(LADIRARRAY) .OR. SZ_FTP.GETERRORCODE(.F.) <> 18
        SZ_FTP.GETERRORCODE(.T.)
    ENDIF
 ENDIF
 ?
 ? 'FTP 醴翹: ' + LCDIRNAME
 IF  .NOT. EMPTY(LADIRARRAY)
    FOR X = 1 TO ALEN(LADIRARRAY,1)
       LCOUTPUT =  ;
            '   ' + PADR(LADIRARRAY(X,1),25) + PADL(STR(LADIRARRAY(X,3)),12) + ' ' +  ;
      PADR(DTOC(LADIRARRAY(X,6)),14) + LADIRARRAY(X,7)
       ? LCOUTPUT
    ENDFOR
 ENDIF
 ?
 RETURN
ENDPROC
*------
DEFINE CLASS ftp_Service AS custom
 CIPADDRESS = ''
 CUSERNAME = ''
 CPASSWORD = ''
 CPORT = '21'
 NINET_HANDLE = 0
 NCONNECT_HANDLE = 0
 LDLL_LOADED = .F.
 NRESULT_CODE = 0
 NEXTENDED_RESULT = 0
 CEXTENDED_MESSAGE = ''
 CCURRENTDIR = ''
 CAGENT = 'Visual FoxPro' + CHR(0)

PROCEDURE init
 IF _DOS .OR. _UNIX .OR. _MAC
    RETURN .F.
 ENDIF
ENDPROC
*------

PROCEDURE LoadAPIFuncs
 LOCAL LPCAGENT , NACCESSTYPE , LPCPROXYNAME , LPCPROXYBYPASS , NFLAGS
 LOCAL NINET_HANDLE , NCONNECT_HANDLE , LPCSERVER , NPORT , LPCUSERNAME
 LOCAL LPCPASSWORD , NSERVICE , NCONTEXT , NMAX_PATH
 LOCAL LPCDIRECTORY , LPCFILENAME , LPCSEARCHSTR , LPCWIN32_FIND_DATA
 LOCAL LPCREMOTEFILE , LPCNEWFILE , NFAILIFEXISTS , NATTRIBUTES
 LOCAL NERROR , LPCBUFFER
 IF THIS.LDLL_LOADED
    RETURN 0
 ENDIF
 DECLARE INTEGER GetLastError IN Kernel32
 DECLARE INTEGER FileTimeToSystemTime IN Kernel32 STRING @ , STRING @
 DECLARE INTEGER InternetOpen IN WinInet STRING @ , INTEGER , STRING @ , STRING @ ,  ;
      INTEGER
 DECLARE INTEGER InternetConnect IN WinInet INTEGER , STRING @ , SHORT , STRING @ ,  ;
      STRING @ , INTEGER , INTEGER , INTEGER
 DECLARE INTEGER InternetCloseHandle IN WinInet INTEGER
 DECLARE INTEGER FtpCreateDirectory IN WinInet INTEGER , STRING @
 DECLARE INTEGER FtpDeleteFile IN WinInet INTEGER , STRING @
 DECLARE INTEGER FtpFindFirstFile IN WinInet INTEGER , STRING @ , STRING @ , INTEGER ,  ;
      INTEGER
 DECLARE INTEGER InternetFindNextFile IN WinInet INTEGER , STRING @
 DECLARE INTEGER FtpGetCurrentDirectory IN WinInet INTEGER , STRING @ , INTEGER @
 DECLARE INTEGER FtpGetFile IN WinInet INTEGER , STRING @ , STRING @ , INTEGER , INTEGER ,  ;
      INTEGER , INTEGER
 DECLARE INTEGER FtpOpenFile IN WinInet INTEGER , STRING @ , INTEGER , INTEGER , INTEGER
 DECLARE INTEGER FtpPutFile IN WinInet INTEGER , STRING @ , STRING @ , INTEGER , INTEGER
 DECLARE INTEGER FtpRemoveDirectory IN WinInet INTEGER , STRING @
 DECLARE INTEGER FtpRenameFile IN WinInet INTEGER , STRING @ , STRING @
 DECLARE INTEGER FtpSetCurrentDirectory IN WinInet INTEGER , STRING @
 DECLARE INTEGER InternetGetLastResponseInfo IN WinInet INTEGER @ , STRING @ , INTEGER @
 THIS.LDLL_LOADED = .T.
 RETURN 0
ENDPROC
*------

PROCEDURE OpenInternet
 LPARAMETER LCUSERNAME , LCPASSWORD , LCIPADDRESS , LCPORT
 LOCAL LNPCOUNT , FRESULT , LCTEMPDIR , LNCONNECTHANDLE
 LNPCOUNT = PARAMETERS()
 IF LNPCOUNT <> 4
    NRESULT_CODE = 12010
    RETURN .F.
 ENDIF
 IF (TYPE('lcUserName') <> 'C') .OR. (TYPE('lcPassword') <> 'C') .OR.  ;
(TYPE('lcIPAddress') <> 'C') .OR. (TYPE('lcPort') <> 'C')
    NRESULT_CODE = 87
    RETURN .F.
 ENDIF
 IF EMPTY(LCUSERNAME) .OR. EMPTY(LCPASSWORD) .OR. EMPTY(LCIPADDRESS)
    NRESULT_CODE = 12010
    RETURN .F.
 ENDIF
 IF THIS.LOADAPIFUNCS() <> 0
    RETURN .F.
 ENDIF
 THIS.CUSERNAME = LCUSERNAME + CHR(0)
 THIS.CPASSWORD = LCPASSWORD + CHR(0)
 THIS.CIPADDRESS = LCIPADDRESS + CHR(0)
 THIS.CPORT = LCPORT
 THIS.NINET_HANDLE = INTERNETOPEN((THIS.CAGENT),1,CHR(0),CHR(0),0)
  THIS.GETEXTENDEDERROR()
 IF THIS.NINET_HANDLE = 0
     THIS.CLOSEFTP()
    RETURN .F.
 ENDIF
 LNCONNECT_HANDLE =  ;
      INTERNETCONNECT(THIS.NINET_HANDLE,(THIS.CIPADDRESS),VAL(LCPORT),(THIS.CUSERNAME),(THIS.CPASSWORD),1,0,0)
  THIS.GETEXTENDEDERROR()
 IF LNCONNECT_HANDLE <> 0
    LCTEMPDIR = SPACE(260)
    FRESULT = FTPGETCURRENTDIRECTORY(LNCONNECT_HANDLE,@LCTEMPDIR,260)
     THIS.GETEXTENDEDERROR()
    IF FRESULT <> 0
       THIS.CCURRENTDIR = LCTEMPDIR
        INTERNETCLOSEHANDLE(LNCONNECT_HANDLE)
    ELSE
       RETURN .F.
    ENDIF
 ELSE
    RETURN .F.
 ENDIF
 RETURN .T.
ENDPROC
*------

PROCEDURE OpenFtpConnection
 LOCAL NHANDLE , LNCONNECT_HANDLE , LCCURRENTDIR
 LNCONNECT_HANDLE =  ;
      INTERNETCONNECT(THIS.NINET_HANDLE,(THIS.CIPADDRESS),VAL(THIS.CPORT),(THIS.CUSERNAME),(THIS.CPASSWORD),1,0,0)
  THIS.GETEXTENDEDERROR()
 LCCURRENTDIR = THIS.CCURRENTDIR
 IF LNCONNECT_HANDLE <> 0
    FRESULT = FTPSETCURRENTDIRECTORY(LNCONNECT_HANDLE,@LCCURRENTDIR)
    IF FRESULT = 1
       THIS.NCONNECT_HANDLE = LNCONNECT_HANDLE
       RETURN .T.
    ELSE
        THIS.GETEXTENDEDERROR()
       RETURN .F.
    ENDIF
 ELSE
    RETURN .F.
 ENDIF
ENDPROC
*------

PROCEDURE CloseFtpConnection
 IF THIS.NCONNECT_HANDLE <> 0
     INTERNETCLOSEHANDLE(THIS.NCONNECT_HANDLE)
 ENDIF
 THIS.NCONNECT_HANDLE = 0
 RETURN
ENDPROC
*------

PROCEDURE CloseInternet
 IF THIS.NINET_HANDLE <> 0
     INTERNETCLOSEHANDLE(THIS.NINET_HANDLE)
    THIS.NINET_HANDLE = 0
 ENDIF
ENDPROC
*------

PROCEDURE GetFtpFile
 LPARAMETER LCREMOTEFILE , LCNEWFILE , LLFAILIFEXISTS
 LOCAL FRESULT , LNFAIL
 IF THIS.OPENFTPCONNECTION()
    IF LLFAILIFEXISTS
       LNFAIL = 1
    ELSE
       LNFAIL = 0
    ENDIF
    LCNEWFILE = LCNEWFILE + CHR(0)
    LCREMOTEFILE = LCREMOTEFILE + CHR(0)
    FRESULT =  ;
         FTPGETFILE(THIS.NCONNECT_HANDLE,@LCREMOTEFILE,@LCNEWFILE,LNFAIL,128,2,0)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE PutFtpFile
 LPARAMETER LCREMOTEFILE , LCLOCALFILE
 LOCAL FRESULT
 IF THIS.OPENFTPCONNECTION()
    LCREMOTEFILE = LCREMOTEFILE + CHR(0)
    LCLOCALFILE = LCLOCALFILE + CHR(0)
    FRESULT = FTPPUTFILE(THIS.NCONNECT_HANDLE,@LCLOCALFILE,@LCREMOTEFILE,2,0)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE DeleteFtpFile
 LPARAMETER LCREMOTEFILE
 LOCAL FRESULT
 IF THIS.OPENFTPCONNECTION()
    LCREMOTEFILE = LCREMOTEFILE + CHR(0)
    FRESULT = FTPDELETEFILE(THIS.NCONNECT_HANDLE,@LCREMOTEFILE)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE RenameFtpFile
 LPARAMETER LCOLDFILE , LCNEWFILE
 LOCAL FRESULT
 IF THIS.OPENFTPCONNECTION()
    LCOLDFILE = LCOLDFILE + CHR(0)
    LCNEWFILE = LCNEWFILE + CHR(0)
    FRESULT = FTPRENAMEFILE(THIS.NCONNECT_HANDLE,@LCOLDFILE,@LCNEWFILE)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE CreateFtpDirectory
 LPARAMETER LCNEWDIR
 LOCAL FRESULT
 IF THIS.OPENFTPCONNECTION()
    LCNEWDIR = LCNEWDIR + CHR(0)
    FRESULT = FTPCREATEDIRECTORY(THIS.NCONNECT_HANDLE,@LCNEWDIR)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE RemoveFtpDirectory
 LPARAMETER LCNEWDIR
 LOCAL FRESULT
 IF THIS.OPENFTPCONNECTION()
    LCNEWDIR = LCNEWDIR + CHR(0)
    FRESULT = FTPREMOVEDIRECTORY(THIS.NCONNECT_HANDLE,@LCNEWDIR)
     THIS.GETEXTENDEDERROR()
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE ChangeFtpDirectory
 LPARAMETER LCNEWDIR
 LOCAL FRESULT , LCTEMPDIR , LLRESULT
 IF THIS.OPENFTPCONNECTION()
    LLRESULT = .F.
    LCNEWDIR = LCNEWDIR + CHR(0)
    LCTEMPDIR = SPACE(260)
    FRESULT = FTPSETCURRENTDIRECTORY(THIS.NCONNECT_HANDLE,@LCNEWDIR)
     THIS.GETEXTENDEDERROR()
    IF FRESULT = 1
       FRESULT = FTPGETCURRENTDIRECTORY(THIS.NCONNECT_HANDLE,@LCTEMPDIR,260)
        THIS.GETEXTENDEDERROR()
       IF FRESULT = 1
          THIS.CCURRENTDIR = LCTEMPDIR
          LLRESULT = .T.
       ENDIF
    ENDIF
     THIS.CLOSEFTPCONNECTION()
    RETURN LLRESULT
 ENDIF
ENDPROC
*------

PROCEDURE GetFtpDirectory
 LPARAMETER LCDIRECTORY
 LOCAL FRESULT , LCTEMPDIR
 IF THIS.OPENFTPCONNECTION()
    LCTEMPDIR = SPACE(260)
    FRESULT = FTPGETCURRENTDIRECTORY(THIS.NCONNECT_HANDLE,@LCTEMPDIR,260)
     THIS.GETEXTENDEDERROR()
    LCDIRECTORY = LEFT(LCTEMPDIR,AT(CHR(0),LCTEMPDIR) - 1)
     THIS.CLOSEFTPCONNECTION()
    IF FRESULT = 1
       RETURN .T.
    ELSE
       RETURN .F.
    ENDIF
 ENDIF
ENDPROC
*------

PROCEDURE GetFtpDirectoryArray
 LPARAMETER LADIRECTORY , LCMASK
 LOCAL CSTRUCT , LLRESULT , LNCOUNT , FRESULT , LFFHANDLE
 IF THIS.OPENFTPCONNECTION()
    LCMASK = LCMASK + CHR(0)
    DIMENSION LADIRECTORY( 1 , 7 )
    LADIRECTORY( 1 , 1 ) = .F.
    LCSTRUCT = SPACE(319)
    LFFHANDLE = FTPFINDFIRSTFILE(THIS.NCONNECT_HANDLE,@LCMASK,@LCSTRUCT,0,0)
     THIS.GETEXTENDEDERROR()
    IF LFFHANDLE = 0 .OR. THIS.NRESULT_CODE = 18
        THIS.CLOSEFTPCONNECTION()
       RETURN .F.
    ENDIF
     THIS.CRACKFILE(LCSTRUCT,@LADIRECTORY)
    LLRESULT = 1
    DO WHILE THIS.NRESULT_CODE <> 18 AND LLRESULT <> 0
       LCSTRUCT = SPACE(319)
       LLRESULT = INTERNETFINDNEXTFILE(LFFHANDLE,@LCSTRUCT)
        THIS.GETEXTENDEDERROR()
       IF THIS.NRESULT_CODE <> 18 AND LLRESULT <> 0
           THIS.CRACKFILE(LCSTRUCT,@LADIRECTORY)
       ENDIF
    ENDDO
     THIS.CLOSEFTPCONNECTION()
 ELSE
    RETURN .F.
 ENDIF
 RETURN .T.
ENDPROC
*------

PROCEDURE GetErrorCode
 LPARAMETER LLSHOWMESSAGE
 LOCAL LCMESSAGE
 IF LLSHOWMESSAGE = .T.
    LCMESSAGE =  ;
         '渣昫 (' + ALLTRIM(STR(THIS.NRESULT_CODE)) + ')  -  ' +  ;
   THIS.GETERRORTEXT(THIS.NRESULT_CODE)
    IF  .NOT. EMPTY(THIS.CEXTENDED_MESSAGE)
       LCMESSAGE =  ;
            LCMESSAGE + CHR(13) + CHR(13) + '孺桯渣昫陓洘 - (' +  ;
      ALLTRIM(STR(THIS.NEXTENDED_RESULT)) + ') - ' + THIS.CEXTENDED_MESSAGE
    ENDIF
     MESSAGEBOX(LCMESSAGE,48,'FTP 渣昫陓洘')
 ENDIF
 RETURN THIS.NRESULT_CODE
ENDPROC
*------

PROCEDURE GetExtendedErrorCode
 RETURN THIS.NEXTENDED_RESULT
ENDPROC
*------

PROCEDURE GetExtendedErrorMsg
 RETURN THIS.CEXTENDED_MESSAGE
ENDPROC
*------

PROCEDURE CrackFile
 LPARAMETER LCSTRING , LADIRECTORY
 LOCAL LCFILENAME , LCALTERNAME , LNSIZEHIGH , LNSIZELOW , LNFILESIZE , LCATTRIBUTES ,  ;
      LNARRAYLEN , LCTIMEBUFF , LDCREATEDATE , LDACCESSDATE , LDWRITEDATE ,  ;
      LANEWARRAY , LNRESULT
 IF TYPE('laDirectory[1, 1]') = 'L'
    DIMENSION LADIRECTORY( 1 , 7 )
 ELSE
    DIMENSION LADIRECTORY( ALEN(LADIRECTORY,1) + 1 , 7 )
 ENDIF
 LNARRAYLEN = ALEN(LADIRECTORY,1)
 LCFILENAME = SUBSTR(LCSTRING,45,260)
 LCALTERNAME = RIGHT(LCSTRING,14)
 LCFILENAME = LEFT(LCFILENAME,AT(CHR(0),LCFILENAME) - 1)
 LCALTERNAME = LEFT(LCALTERNAME,AT(CHR(0),LCALTERNAME) - 1)
 LNSIZEHIGH =  ;
      (ASC(SUBSTR(LCSTRING,29,1)) * 1) + (ASC(SUBSTR(LCSTRING,30,1)) * 256) +  ;
(ASC(SUBSTR(LCSTRING,31,1)) * 65536) + (ASC(SUBSTR(LCSTRING,32,1)) * 16777216)
 LNSIZELOW =  ;
      (ASC(SUBSTR(LCSTRING,33,1)) * 1) + (ASC(SUBSTR(LCSTRING,34,1)) * 256) +  ;
(ASC(SUBSTR(LCSTRING,35,1)) * 65536) + (ASC(SUBSTR(LCSTRING,36,1)) * 16777216)
 LNFILESIZE = (LNSIZEHIGH * 4294967295) + LNSIZELOW
 LCTIMEBUFF = SUBSTR(LCSTRING,5,8)
 LDCREATEDATE = THIS.CRACKDATE(LCTIMEBUFF)
 LCTIMEBUFF = SUBSTR(LCSTRING,13,8)
 LDACCESSDATE = THIS.CRACKDATE(LCTIMEBUFF)
 LCTIMEBUFF = SUBSTR(LCSTRING,21,8)
 LDWRITEDATE = THIS.CRACKDATE(LCTIMEBUFF)
 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
ENDPROC
*------

PROCEDURE CrackDate
 LPARAMETER LCOUTBUFFER
 LOCAL LCINBUFFER , LDDATETIME , FRESULT , LCBUILD , LNDAY , LNMONTH , LNYEAR , LNHOUR ,  ;
      LNMINUTE , LNSECOND
 LCINBUFFER = SPACE(16)
 FRESULT = FILETIMETOSYSTEMTIME(@LCOUTBUFFER,@LCINBUFFER)
  THIS.GETEXTENDEDERROR()
 IF FRESULT = 0
    LDDATETIME = DATETIME(1901,1,1,0,0,0)
    RETURN LDDATETIME
 ENDIF
 LNYEAR = ASC(SUBSTR(LCINBUFFER,1,1)) + (ASC(SUBSTR(LCINBUFFER,2,1)) * 256)
 LNMONTH = ASC(SUBSTR(LCINBUFFER,3,1)) + (ASC(SUBSTR(LCINBUFFER,4,1)) * 256)
 LNDAY = ASC(SUBSTR(LCINBUFFER,7,1)) + (ASC(SUBSTR(LCINBUFFER,8,1)) * 256)
 LNHOUR = ASC(SUBSTR(LCINBUFFER,9,1)) + (ASC(SUBSTR(LCINBUFFER,10,1)) * 256)
 LNMINUTE = ASC(SUBSTR(LCINBUFFER,11,1)) + (ASC(SUBSTR(LCINBUFFER,12,1)) * 256)
 LNSECOND = ASC(SUBSTR(LCINBUFFER,13,1)) + (ASC(SUBSTR(LCINBUFFER,13,1)) * 256)
 LDDATETIME = DATETIME(LNYEAR,LNMONTH,LNDAY,LNHOUR,LNMINUTE,LNSECOND)
 RETURN LDDATETIME
ENDPROC
*------

PROCEDURE CrackAttributes
 LPARAMETER LCBUFFER
 LOCAL LCATTRIBUTES , LNVALUE
 LCATTRIBUTES = ''
 LNVALUE =  ;
      (ASC(SUBSTR(LCBUFFER,1,1)) * 1) + (ASC(SUBSTR(LCBUFFER,2,1)) * 256) +  ;
(ASC(SUBSTR(LCBUFFER,3,1)) * 65536) + (ASC(SUBSTR(LCBUFFER,4,1)) * 16777216)
 DO CASE
 CASE BITTEST(LNVALUE,0)
    LCATTRIBUTES = LCATTRIBUTES + 'R'
 CASE BITTEST(LNVALUE,1)
    LCATTRIBUTES = LCATTRIBUTES + 'H'
 CASE BITTEST(LNVALUE,2)
    LCATTRIBUTES = LCATTRIBUTES + 'S'
 CASE BITTEST(LNVALUE,4)
    LCATTRIBUTES = LCATTRIBUTES + 'D'
 CASE BITTEST(LNVALUE,32)
    LCATTRIBUTES = LCATTRIBUTES + 'A'
 CASE BITTEST(LNVALUE,128)
    LCATTRIBUTES = LCATTRIBUTES + 'N'
 CASE BITTEST(LNVALUE,256)
    LCATTRIBUTES = LCATTRIBUTES + 'T'
 CASE BITTEST(LNVALUE,11)
    LCATTRIBUTES = LCATTRIBUTES + 'C'
 CASE BITTEST(LNVALUE,12)
    LCATTRIBUTES = LCATTRIBUTES + 'O'
 ENDCASE
 RETURN LCATTRIBUTES
ENDPROC
*------

PROCEDURE GetExtendedError
 LOCAL LCMESSAGE , LNERROR , LCBUFFER
 THIS.NRESULT_CODE = GETLASTERROR()
 LNERROR = 0
 LCBUFFER = SPACE(260)
  INTERNETGETLASTRESPONSEINFO(LNERROR,@LCBUFFER,260)
 THIS.NEXTENDED_RESULT = LNERROR
 THIS.CEXTENDED_MESSAGE = LEFT(LCBUFFER,AT(CHR(0),LCBUFFER) - 1)
 RETURN
ENDPROC
*------

PROCEDURE GetErrorText
 LPARAMETER LNERROR
 LOCAL LCMESSAGE
 DO CASE
 CASE LNERROR = 12001
    LCMESSAGE = 'ERROR_INTERNET_OUT_OF_HANDLES'
 CASE LNERROR = 12002
    LCMESSAGE = 'ERROR_INTERNET_TIMEOUT'
 CASE LNERROR = 12003
    LCMESSAGE = 'ERROR_INTERNET_EXTENDED_ERROR'
 CASE LNERROR = 12004
    LCMESSAGE = 'ERROR_INTERNET_INTERNAL_ERROR'
 CASE LNERROR = 12005
    LCMESSAGE = 'ERROR_INTERNET_INVALID_URL'
 CASE LNERROR = 12006
    LCMESSAGE = 'ERROR_INTERNET_UNRECOGNIZED_SCHEME'
 CASE LNERROR = 12007
    LCMESSAGE = 'ERROR_INTERNET_NAME_NOT_RESOLVED'
 CASE LNERROR = 12008
    LCMESSAGE = 'ERROR_INTERNET_PROTOCOL_NOT_FOUND'
 CASE LNERROR = 12009
    LCMESSAGE = 'ERROR_INTERNET_INVALID_OPTION'
 CASE LNERROR = 12010
    LCMESSAGE = 'ERROR_INTERNET_BAD_OPTION_LENGTH'
 CASE LNERROR = 12011
    LCMESSAGE = 'ERROR_INTERNET_OPTION_NOT_SETTABLE'
 CASE LNERROR = 12012
    LCMESSAGE = 'ERROR_INTERNET_SHUTDOWN'
 CASE LNERROR = 12013
    LCMESSAGE = 'ERROR_INTERNET_INCORRECT_USER_NAME'
 CASE LNERROR = 12014
    LCMESSAGE = 'ERROR_INTERNET_INCORRECT_PASSWORD'
 CASE LNERROR = 12015
    LCMESSAGE = 'ERROR_INTERNET_LOGIN_FAILURE'
 CASE LNERROR = 12016
    LCMESSAGE = 'ERROR_INTERNET_INVALID_OPERATION'
 CASE LNERROR = 12017
    LCMESSAGE = 'ERROR_INTERNET_OPERATION_CANCELLED'
 CASE LNERROR = 12018
    LCMESSAGE = 'ERROR_INTERNET_INCORRECT_HANDLE_TYPE'
 CASE LNERROR = 12019
    LCMESSAGE = 'ERROR_INTERNET_INCORRECT_HANDLE_STATE'
 CASE LNERROR = 12020
    LCMESSAGE = 'ERROR_INTERNET_NOT_PROXY_REQUEST'
 CASE LNERROR = 12021
    LCMESSAGE = 'ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND'
 CASE LNERROR = 12022
    LCMESSAGE = 'ERROR_INTERNET_BAD_REGISTRY_PARAMETER'
 CASE LNERROR = 12023
    LCMESSAGE = 'ERROR_INTERNET_NO_DIRECT_ACCESS'
 CASE LNERROR = 12024
    LCMESSAGE = 'ERROR_INTERNET_NO_CONTEXT'
 CASE LNERROR = 12025
    LCMESSAGE = 'ERROR_INTERNET_NO_CALLBACK'
 CASE LNERROR = 12026
    LCMESSAGE = 'ERROR_INTERNET_REQUEST_PENDING'
 CASE LNERROR = 12027
    LCMESSAGE = 'ERROR_INTERNET_INCORRECT_FORMAT'
 CASE LNERROR = 12028
    LCMESSAGE = 'ERROR_INTERNET_ITEM_NOT_FOUND'
 CASE LNERROR = 12029
    LCMESSAGE = 'ERROR_INTERNET_CANNOT_CONNECT'
 CASE LNERROR = 12030
    LCMESSAGE = 'ERROR_INTERNET_CONNECTION_ABORTED'
 CASE LNERROR = 12031
    LCMESSAGE = 'ERROR_INTERNET_CONNECTION_RESET'
 CASE LNERROR = 12032
    LCMESSAGE = 'ERROR_INTERNET_FORCE_RETRY'
 CASE LNERROR = 12033
    LCMESSAGE = 'ERROR_INTERNET_INVALID_PROXY_REQUEST'
 CASE LNERROR = 12034
    LCMESSAGE = 'ERROR_INTERNET_NEED_UI'
 CASE LNERROR = 12036
    LCMESSAGE = 'ERROR_INTERNET_HANDLE_EXISTS'
 CASE LNERROR = 12037
    LCMESSAGE = 'ERROR_INTERNET_SEC_CERT_DATE_INVALID'
 CASE LNERROR = 12038
    LCMESSAGE = 'ERROR_INTERNET_SEC_CERT_CN_INVALID'
 CASE LNERROR = 12039
    LCMESSAGE = 'ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR'
 CASE LNERROR = 12040
    LCMESSAGE = 'ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR'
 CASE LNERROR = 12041
    LCMESSAGE = 'ERROR_INTERNET_MIXED_SECURITY'
 CASE LNERROR = 12042
    LCMESSAGE = 'ERROR_INTERNET_CHG_POST_IS_NON_SECURE'
 CASE LNERROR = 12043
    LCMESSAGE = 'ERROR_INTERNET_POST_IS_NON_SECURE'
 CASE LNERROR = 12044
    LCMESSAGE = 'ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED'
 CASE LNERROR = 12045
    LCMESSAGE = 'ERROR_INTERNET_INVALID_CA'
 CASE LNERROR = 12046
    LCMESSAGE = 'ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP'
 CASE LNERROR = 12047
    LCMESSAGE = 'ERROR_INTERNET_ASYNC_THREAD_FAILED'
 CASE LNERROR = 12048
    LCMESSAGE = 'ERROR_INTERNET_REDIRECT_SCHEME_CHANGE'
 CASE LNERROR = 12049
    LCMESSAGE = 'ERROR_INTERNET_DIALOG_PENDING'
 CASE LNERROR = 12050
    LCMESSAGE = 'ERROR_INTERNET_RETRY_DIALOG'
 CASE LNERROR = 12052
    LCMESSAGE = 'ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR'
 CASE LNERROR = 12053
    LCMESSAGE = 'ERROR_INTERNET_INSERT_CDROM'
 CASE LNERROR = 12110
    LCMESSAGE = 'FTP_TRANSFER_IN_PROGRESS'
 CASE LNERROR = 12111
    LCMESSAGE = 'FTP_DROPPED'
 CASE LNERROR = 12112
    LCMESSAGE = 'FTP_NO_PASSIVE_MODE'
 CASE LNERROR = 12157
    LCMESSAGE = 'ERROR_INTERNET_SECURITY_CHANNEL_ERROR'
 CASE LNERROR = 12158
    LCMESSAGE = 'ERROR_INTERNET_UNABLE_TO_CACHE_FILE'
 CASE LNERROR = 12159
    LCMESSAGE = 'ERROR_INTERNET_TCPIP_NOT_INSTALLED'
 CASE LNERROR = 12163
    LCMESSAGE = 'ERROR_INTERNET_DISCONNECTED'
 CASE LNERROR = 12164
    LCMESSAGE = 'ERROR_INTERNET_SERVER_UNREACHABLE'
 CASE LNERROR = 12165
    LCMESSAGE = 'ERROR_INTERNET_PROXY_SERVER_UNREACHABLE'
 CASE LNERROR = 12166
    LCMESSAGE = 'ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT'
 CASE LNERROR = 12167
    LCMESSAGE = 'ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT'
 CASE LNERROR = 12169
    LCMESSAGE = 'ERROR_INTERNET_SEC_INVALID_CERT'
 CASE LNERROR = 12170
    LCMESSAGE = 'ERROR_INTERNET_SEC_CERT_REVOKED'
 CASE LNERROR = 18
    LCMESSAGE = 'ERROR_NO_MORE_FILES'
 CASE LNERROR = 6
    LCMESSAGE = 'ERROR_INVALID_HANDLE'
 CASE LNERROR = 2
    LCMESSAGE = 'ERROR_FILE_NOT_FOUND'
 CASE LNERROR = 3
    LCMESSAGE = 'ERROR_PATH_NOT_FOUND'
 CASE LNERROR = 5
    LCMESSAGE = 'ERROR_ACCESS_DENIED'
 CASE LNERROR = 80
    LCMESSAGE = 'ERROR_FILE_EXISTS'
 CASE LNERROR = 87
    LCMESSAGE = 'ERROR_INVALID_PARAMETER'
 OTHERWISE
    LCMESSAGE = '帤眭腔渣昫陓洘'
 ENDCASE
 RETURN LCMESSAGE
ENDPROC
*------
ENDDEFINE
*------*

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################


Ruey 在 星期日 九月 14, 2003 7:49 pm 作了第 4 次修改
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期日 七月 27, 2003 1:48 pm    文章主題: 引言回覆

*本程式由 Larry 撰寫之 FTP上下傳程式節錄(轉貼來源阿貴)
&& 宣告 wininet.dll
DECLARE INTEGER InternetOpen IN wininet ; && 開啟 internet 連結
STRING sAgent, ;
INTEGER lAccessType, ;
STRING sProxyName, ;
STRING sProxyBypass, ;
STRING lFlags

DECLARE INTEGER InternetConnect IN wininet; && 連結 ftp or http
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

***** 開始連線
sAgent = "vfp7" && 自訂一個名稱(隨便)
sProxyName = 0 && 不使用Proxy server -->vb 不是 chr(0) 是用 null
sProxyBypass = 0 && 不回復訊息
lFlags = 0 && 預設值

* 開啟連結 (建立 internet session)
*!* hOpen = InternetOpen (sAgent, INTERNET_OPEN_TYPE_DIRECT,;
*!* sProxyName, sProxyBypass, lFlags)
hOpen = InternetOpen (sAgent, 1, sProxyName, sProxyBypass, lFlags)


IF hOpen = 0 && 如果傳回0代表不成功
wait window '無法開啟連結'
RETURN
ENDIF

* 設定登入的使用者名稱
strHost = '203.133.5.35' && 要登入的ftp位址或名稱
port=21 && ftp 的通訊埠
strUser = '' && 使用者名稱
strPwd = '' && 密碼

************** 連線至 ftp
*!* hFtpSession = InternetConnect (hOpen, strHost, port, strUser, strPwd, INTERNET_SERVICE_FTP, 0, 0)
hFtpSession = InternetConnect (hOpen, strHost, port, strUser, strPwd, 1, 0, 0)

IF hFtpSession = 0
wait window '無法連上 FTP'
RETURN
ENDIF

lcSource = 'D: est.xls' && 上傳檔
lcTarget = 'test.xls' && 目的檔

*!* IF FtpPutFile (hFtpSession, lcSource,lcTarget, FTP_TRANSFER_TYPE_BINARY, 0) = 1
IF FtpPutFile (hFtpSession, lcSource,lcTarget, 2, 0) = 1
wait window '上傳成功'
ELSE
wait window '上傳失敗'
ENDIF

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 3 樓

發表發表於: 星期日 七月 27, 2003 1:50 pm    文章主題: 引言回覆

*本程式由 Larry 撰寫之 FTP上下傳程式節錄

* lAccessType - internet 連結的存取方式
#DEFINE INTERNET_INVALID_PORT_NUMBER 0
#DEFINE INTERNET_OPEN_TYPE_DIRECT 1
#DEFINE INTERNET_OPEN_TYPE_PROXY 3
#DEFINE INTERNET_DEFAULT_FTP_PORT 21
#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
#DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0
#DEFINE FTP_TRANSFER_TYPE_ASCII 1
#DEFINE FTP_TRANSFER_TYPE_BINARY 2
#DEFINE INTERNET_SERVICE_FTP 1
#DEFINE INTERNET_SERVICE_GOPHER 2
#DEFINE INTERNET_SERVICE_HTTP 3
#DEFINE FILE_ATTRIBUTE_NORMAL 128 && 0x00000080

&& 宣告 wininet.dll
DECLARE INTEGER InternetOpen IN wininet; && 開啟 internet 連結
STRING sAgent, INTEGER lAccessType, STRING sProxyName,;
STRING sProxyBypass, STRING lFlags

DECLARE INTEGER InternetCloseHandle IN wininet INTEGER hInet && 關閉 internet 連結

DECLARE INTEGER InternetConnect IN wininet; && 連結 ftp or http
INTEGER hInternetSession, STRING sServerName,;
INTEGER nServerPort, STRING sUsername,;
STRING sPassword, INTEGER lService,;
INTEGER lFlags, INTEGER lContext

DECLARE INTEGER FtpGetFile IN wininet; && 下載 ftp 檔案
INTEGER hFtpSession, STRING lpszRemoteFile,;
STRING lpszNewFile, INTEGER fFailIfExists,;
INTEGER dwFlagsAndAttributes,;
INTEGER dwFlags, INTEGER dwContext


sAgent = "vfp7" && 自訂一個名稱(隨便)
sProxyName = Chr(0) && 不使用Proxy server -->vb 不是 chr(0) 是用 null
sProxyBypass = Chr(0) && 不回復訊息
lFlags = 0 && 預設值

* 開啟連結 (建立 internet session)
hOpen = InternetOpen (sAgent, INTERNET_OPEN_TYPE_DIRECT,;
sProxyName, sProxyBypass, lFlags)


IF hOpen = 0 && 如果傳回0代表不成功
MESSAGEBOX("找不到必須的檔案 WinInet.Dll",6+16,"錯誤訊息!")
RETURN
ELSE
WAIT windows "Wininet access handle: " + LTRIM(STR(hOpen)) nowait
ENDIF

* 設定登入的使用者名稱
strHost = "203.217.100.105" && 要登入的ftp位址或名稱(這的我的ip)
strUser = "anonymous" && 使用者名稱
strPwd = "anonymous"

* 連線至 ftp
hFtpSession = InternetConnect (hOpen, strHost,;
INTERNET_INVALID_PORT_NUMBER,;
strUser, strPwd,;
INTERNET_SERVICE_FTP, 0, 0)

IF hFtpSession = 0
* 關閉由 internetopen 所產生的 hande
= InternetCloseHandle (hOpen)
MESSAGEBOX("測試失敗,請重新設定!...",6+16,"錯誤訊息!")
RETURN
ELSE
MESSAGEBOX("測試成功!...",0+64,"訊息!")
* 全部工作完時關閉由 internetopen 所產生的 hande,但如要再測下載的話不可關閉
= InternetCloseHandle (hFtpSession)
= InternetCloseHandle (hOpen)
ENDIF

RETURN .t.




** 以下是下載 ftp 的檔案的指令
lpszRemoteFile = "text.txt" && 要下載的檔案
lpszNewFile = "c:\Temp\text.txt" && 要存檔的名稱
fFailIfExists = 0 &&
dwContext = 0
** 下載 ftp 檔案
lnResult = FtpGetFile (hFtpSession, lpszRemoteFile, lpszNewFile,;
fFailIfExists, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII,;
dwContext)

IF lnResult = 1 && 傳回1的話下載成功
MODI FILE (lpszNewFile) && 開啟下載回來的檔案
ELSE
MESSAGEBOX("下載檔案失敗!...",6+16,"錯誤訊息!")
ENDIF

* 全部工作完時關閉由 internetopen 所產生的 hande
= InternetCloseHandle (hFtpSession)
= InternetCloseHandle (hOpen)
RETURN


&& 比較 wininet.ocx 及 wininet.dll 之後結果 ocx 每次工作時一定要先 open ftp 結束還要 close ftp
&& 所以每次一直作重覆的工作,使用上效率大大的比不上 dll ,而且dll也不會發生之前有兄台說過的每一個
&& 工作之後一定要等三秒鐘的情況發生效率有長足的提昇,用的上的人不妨改用 dll 的方式
&& 如果有興趣的話下次再貼如何上傳,刪除,建立目錄,刪除目錄,及取得 ftp 所有檔案及目錄的方法

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 4 樓

發表發表於: 星期二 七月 29, 2003 11:36 pm    文章主題: 引言回覆

評語:做的很不錯,FTP作成類別
建議最好還是參考第一篇的

myf1 作者:驕傲公主
FTP上下傳範例
記得Ezftp.ocx要註冊

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Christopher



註冊時間: 2003-07-29
文章: 1
來自: taipei

第 5 樓

發表發表於: 星期四 七月 31, 2003 3:04 pm    文章主題: 引言回覆

請問為何我用第二篇ㄉ下載,卻一直發生 "下載檔案失敗!..."
是否與 遠端檔案ㄉ檔名有關?(我直接用 "abc.txt" )
或是近端檔名有關?(我用 "abc.txt" )
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 6 樓

發表發表於: 星期四 七月 31, 2003 3:10 pm    文章主題: 引言回覆

第二篇ㄉ是上傳的,不要搞錯
_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
tanywei



註冊時間: 2003-12-23
文章: 1


第 7 樓

發表發表於: 星期三 十二月 24, 2003 5:20 pm    文章主題: 引言回覆

請教各位大大:
我用第二篇上傳的方式,請問如何將上傳檔案設定上傳到想上傳的目錄下...
如lcTarget = '\\acc\test.exe' && 目的檔
就是將test.exe放至ftp server 的acc資料夾上...
謝謝 Very Happy
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 8 樓

發表發表於: 星期四 十二月 25, 2003 5:05 pm    文章主題: 引言回覆

裡頭要上傳的位址/帳號/密碼,下傳的目錄檔案,你沒有改到
第二篇文章沒有考慮到遠端目錄位置,這各需要參考第一篇修改.
但這無妨,範例是可以使用的


* 設定登入的使用者名稱
strHost = "203.217.100.105" && 要登入的ftp位址或名稱(這的我的ip)
strUser = "anonymous" && 使用者名稱
strPwd = "anonymous"



lcSource = 'D: est.xls' && 上傳檔
lcTarget = 'test.xls' && 目的檔

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
goto-dream



註冊時間: 2004-05-11
文章: 909


第 9 樓

發表發表於: 星期一 五月 24, 2004 10:23 am    文章主題: 引言回覆

Ruey 寫到:
評語:做的很不錯,FTP作成類別
建議最好還是參考第一篇的

myf1 作者:驕傲公主
FTP上下傳範例
記得Ezftp.ocx要註冊



他的程式中.有部分程式要改成
ConnectTo(ALLTRIM(ThisForm.HostName.Value) , ALLTRIM(ThisForm.UserName.Value) , ALLTRIM(ThisForm.PassWord.Value))

他忘了加入ALLTRIM.否則容易連不上

_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
statan



註冊時間: 2005-11-23
文章: 8


第 10 樓

發表發表於: 星期三 十一月 08, 2006 4:01 pm    文章主題: 引言回覆

Larry 大大 可否再提供 刪除及查詢的用法
回頂端
檢視會員個人資料 發送私人訊息
alovexjh



註冊時間: 2005-12-28
文章: 13
來自: 中國

第 11 樓

發表發表於: 星期二 十一月 14, 2006 11:40 am    文章主題: 引言回覆

收了 学习中.............
_________________
小學上語文課時,老師講到帥字,我百思不得其解,旁邊得小妹妹偷偷遞過一把小鏡子一照,剎那間我明白了!
回頂端
檢視會員個人資料 發送私人訊息 雅虎訊息通 MSN Messenger
whh



註冊時間: 2010-04-16
文章: 166


第 12 樓

發表發表於: 星期二 七月 03, 2012 5:17 pm    文章主題: 引言回覆

請問我參考了這篇~

要RUN至少5分鐘這樣正常嗎...?

而且檔案上傳失敗

是哪個細節沒注意到嗎?
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 13 樓

發表發表於: 星期二 七月 03, 2012 5:54 pm    文章主題: 引言回覆

檔案上傳失敗 ,
1.要注意是不是 FTP Server 的權限問題
2.檔案名稱編碼問題有時也得注意一下,Big5 or utf-8
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作