Eu fiz este programa uns 5 anos atrás para fazer o que você tá querendo.
Código: Selecionar todos
#include "inkey.ch"
#include "visual2.ch"
#include "ctscan.ch"
#include "Setcurs.ch"
#include "Error.ch"
#include "Achoice.ch"
#include "FileIO.ch"
#include "common.ch"
SET SCOREBOARD OFF
SET DELETED ON
SET SAFETY OFF
SET DATE BRITISH
SET ESCAPE ON
SET CENTURY ON
SET DELIMITERS TO
SET CURSOR OFF
SET EXCLUSIVE OFF
SET WRAP ON
SET INTENSITY ON
SET EPOCH TO 1964
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
PUBLIC cErro
PUBLIC cDirSys:=""
CLS
EGAPALETTE("GR",43)
EGAPALETTE("BG",9) //9
EGAPALETTE("R+",36)
EGAPALETTE("R*",36)
EGAPALETTE("B+",11)
EGAPALETTE("G+",18)
EGAPALETTE("B",9)
SETBLINK(.F.)
VL850()
FreeTSlice(20)
ScrInicial := WIN(00,00,23,79," "+BLISERNUM()+" - ENVIO DE ARQUIVOS POR FTP ",WT_AZUL1CINZA,WD_AZUL1CINZA,.F.)
CLEARWIN(24,00,24,79,"B/W*")
aBtn := NewButton()
AddButton(aBtn,03,01,18,"&Enviar","Iniciar o Envio de Arquivos",.T.,{|| Enviar()})
SELECT 1
DO WHILE !NETUSE("FTP",.T.,0)
ENDDO
SELECT FTP
DBGOTOP()
lEnvio :=.F.
lContinua:=.T.
WHILE .T.
nOpcao := ProcButton(aBtn)
IF !lContinua
EXIT
ENDIF
IF lEnvio
MsgBox3D1({"",;
" ARQUIVOS ENVIADOS COM SUCESSO",;
"",;
""},;
"ATENۂO") // SEGUNDO PARAMETRO (TITULO)
ELSE
MsgBox3D1({"",;
"OS ARQUIVOS NÇO FORAM ENVIADOS",;
"",;
"1 - VERIFIQUE SE Hµ CONEXÇO COM A INTERNET",;
"",;
"2 - VERIFIQUE SE O MODEM ESTµ LIGADO ",;
"",;
"3 - VERIFIQUE SE Hµ ARQUIVOS PARA ENVIO ",;
"",;
"4 - ENTRE EM CONTATO COM O SUPORTE "},;
"ATENۂO") // SEGUNDO PARAMETRO (TITULO)
IF ALERTA("TENTAR NOVAMENTE O ENVIO ?",42) == 1
KEYBOARD CHR(13)
LOOP
ELSE
EXIT
ENDIF
ENDIF
ENDDO
CLOSE ALL
CLS
@23,00
QUIT
FUNCTION ENVIAR
IF LASTKEY() = 27
lContinua:=.F.
RETURN NIL
ENDIF
@05,01 SAY "Verificando Arquivos" COLOR "N/W"
aArq:={}
cFile:=FTP->DirFTP+"*.*" //FILESEEK("..\ENVIADO\*.*")
DO WHILE !EMPTY(cFile)
AADD(aArq,cFile)
cFile:=FILESEEK()
ENDDO
IF LEN(aArq) > 0
@06,01 SAY "Gerando Script FTP" COLOR "N/W"
ScriptFTP("*.doc")
IF FILE("ENVIA.FTP")
@07,01 SAY "Verificando ConexÆo" COLOR "N/W"
SWPRUNCMD("ftp -n -i -s:envia.ftp > envio.ftp",0)
ENDIF
lEnvio:=CHKFTP()
@09,01 SAY IIF(lEnvio,"Arquivos Enviados Com Sucesso","Arquivos NÆo Foram Enviados! ") COLOR "N/W"
FILEDELETE("ENVIA.FTP")
FILEDELETE("ENVIO.FTP")
ELSE
ALERTA("NÇO Hµ ARQUIVOS PARA SEREM ENVIADOS!",2)
ENDIF
RETURN
FUNCTION CHKFTP
LOCAL lEnvio:=.F., v_Erro:=""
IF FILE("ENVIO.FTP")
v_Erro:=MEMOREAD("ENVIO.FTP")
IF AT("Goodbye",v_Erro) > 0
lEnvio:=.T.
ENDIF
ENDIF
RETURN lEnvio
FUNCTION CHKENVIO
LOCAL lEnvio:=.T., dDataFile
IF FILE("ENVIO.FTP")
dDataFile:=FILEDATE("ENVIO.FTP")
aRet := FSEARCH("ENVIO.FTP","Goodbye")
IF LEN(aRet) > 0
nHANDLE:=FOPEN("ENVIO.FTP")
IF FERROR() = 0
FSEEK(nHANDLE,aRet[1])
cVar=FREADSTR(nHANDLE,7)
IF !cVar $ "Goodbye"
lEnvio := .F.
ENDIF
ELSE
lEnvio := .F.
ENDIF
FCLOSE(nHANDLE)
ELSE
lEnvio := .F.
ENDIF
ELSE
lEnvio := .F.
ENDIF
RETURN lEnvio
FUNCTION SCRIPTFTP(cArquivos)
DEFAULT cArquivos TO ""
//SELECT 1
//DO WHILE !NETUSE("FTP",.T.,0)
//ENDDO
//SELECT FTP
//DBGOTOP()
IF FILE("ENVIA.FTP")
FILEDELETE("ENVIA.FTP")
ENDIF
SET DEVICE TO PRINTER
SET PRINT ON
SET PRINTER TO ENVIA.FTP
SETPRC(0,0)
nLin:=0
@nLin,000 SAY "open "+LOWER(RTRIM(FTP->Host))+" "+RTRIM(FTP->Porta)
nLin++
@nLin,000 SAY "user "+LOWER(RTRIM(FTP->Usuario))+" "+LOWER(RTRIM(FTP->Senha))
nLin++
IF !EMPTY(FTP->Pasta)
@nLin,000 SAY "cd "+LOWER(RTRIM(FTP->Pasta))
nLin++
ENDIF
@nLin,000 SAY "mput "+LOWER(RTRIM(FTP->DirFTP))+cArquivos
IF cArquivos=".txt"
nLin++
@nLin,000 SAY "mput "+LOWER(RTRIM(FTP->DirFTP))+cArquivos
ENDIF
nLin++
@nLin,000 SAY "bye"
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
//CLOSE FTP
RETURN NIL
FUNCTION ALERTA(cMensagem,nSituacao,cMen1,cMen2,cMen3,cMen4,cMen5)
LOCAL nOpcao:=1, nFoco:=1
DEFAULT nSituacao TO 1
DO CASE
CASE nSituacao = 1
nOpcao := MsgBox2(cMensagem)
CASE nSituacao = 2
DO CASE
CASE PCOUNT() = 2
MsgBox1(cMensagem)
CASE PCOUNT() = 4
MsgBox1({cMensagem,;
cMen1,;
cMen2})
CASE PCOUNT() = 5
MsgBox1({cMensagem,;
cMen1,;
cMen2,;
cMen3})
CASE PCOUNT() = 6
MsgBox1({cMensagem,;
cMen1,;
cMen2,;
cMen3,;
cMen4})
CASE PCOUNT() = 7
MsgBox1({cMensagem,;
cMen1,;
cMen2,;
cMen3,;
cMen4,;
cMen5})
ENDCASE
CASE STR(nSituacao,2) $ "31,32,41,42"
IF SUBST(STR(nSituacao,2),1,1) = "3"
cBotao1:="Autoriza"
cBotao2:="Cancela"
nFoco := VAL(SUBST(STR(nSituacao,2),2,1))
ENDIF
IF SUBST(STR(nSituacao,2),1,1) = "4"
cBotao1:="Sim"
cBotao2:="NÆo"
nFoco := VAL(SUBST(STR(nSituacao,2),2,1))
ENDIF
DO CASE
CASE PCOUNT() = 2
nOpcao := MsgBox2({cMensagem,;
cMen1},"Aten‡Æo",,cBotao1,cBotao2,nFoco,,WT_AZUL2BRANCO,WD_AZUL2BRANCO)
CASE PCOUNT() = 3
nOpcao := MsgBox2({cMensagem,;
cMen1 ,;
cMen2},"Aten‡Æo",,cBotao1,cBotao2,nFoco,,WT_AZUL2BRANCO,WD_AZUL2BRANCO)
CASE PCOUNT() = 4
nOpcao := MsgBox2({cMensagem,;
cMen1 ,;
cMen2 ,;
cMen3},"Aten‡Æo",,cBotao1,cBotao2,nFoco,,WT_AZUL2BRANCO,WD_AZUL2BRANCO)
CASE PCOUNT() = 5
nOpcao := MsgBox2({cMensagem,;
cMen1 ,;
cMen2 ,;
cMen3 ,;
cMen4},"Aten‡Æo",,cBotao1,cBotao2,nFoco,,WT_AZUL2BRANCO,WD_AZUL2BRANCO)
CASE PCOUNT() = 6
nOpcao := MsgBox2({cMensagem,;
cMen1 ,;
cMen2 ,;
cMen3 ,;
cMen4 ,;
cMen5},"Aten‡Æo",,cBotao1,cBotao2,nFoco,,WT_AZUL2BRANCO,WD_AZUL2BRANCO)
ENDCASE
CASE nSituacao = 5
nOpcao := MsgBox2(cMensagem,,,,,2)
ENDCASE
RETURN (nOpcao)
FUNCTION DWNMSG(cMsg,cCor)
IF PCOUNT() > 1
@ 24,00 SAY PADC(cMsg,80) COLOR cCor
ENDIF
RETURN NIL
FUNCTION NETUSE(cDatabase,lOpenMode,nSeconds,cDiretorio)
LOCAL lForever
DEFAULT nSeconds TO 0 ,;
lOpenMode TO .F.,;
cDiretorio TO ""
lForever := (nSeconds = 0)
DO WHILE (lForever .OR. nSeconds > 0)
IF lOpenMode
USE (cDirSys+cDatabase) EXCLUSIVE
ELSE
USE (cDirSys+cDatabase) SHARED // Shared
ENDIF
IF .NOT. NETERR() // USE succeeds
RETURN (.T.)
ENDIF
INKEY(1) // Wait 1 second
nSeconds --
ENDDO
RETURN (.F.) // USE fails