Copiando arquivos via AdvPL

Olá pessoal…

Hoje vou mostrar 3 formas de copiar arquivos utilizando a linguagem AdvPL (irei exemplificar a cópia de arquivos de dentro da Protheus Data para uma estação que está executando o Smart Client).


AdvPL

AdvPL

Primeiramente iremos declarar 4 variáveis, uma delas contendo a pasta temporária da máquina (função GetTempPath()), a segunda, nossa pasta customizada dentro da Protheus Data (representada pela pasta \x_diretorio\), a pasta que contendo o caminho da Protheus Data na rede (para exemplificarmos a cópia utilizando o Windows) e por último, o Array que contém os arquivos PDF do diretório do servidor:

//Definindo os diretórios
cDirUsr  := GetTempPath()
cDirSrv  := '\x_Diretorio\'
cDirFull := '\\SEU_IP\Protheus_Data' + cDirSrv
aDirAux  := Directory(cDirSrv+'*.pdf')

Agora iremos utilizar um exemplo da função __CopyFile, esta função permite copiar arquivos entre o servidor e a estação, assim como inverso.

//Percorre os arquivos
For nAtual := 1 To Len(aDirAux)
	//Pegando o nome do arquivo
	cNomArq := aDirAux[nAtual][1]
	
	//Copia o arquivo do Servidor para a máquina do usuário
	__CopyFile(cDirSrv+cNomArq, cDirUsr+cNomArq)
Next nAtual

O exemplo abaixo, é a função CpyS2T (veja CpyS2T no TDN), que copia arquivos do Servidor (Protheus Data) para a estação.

//Percorre os arquivos
For nAtual := 1 To Len(aDirAux)
	//Pegando o nome do arquivo
	cNomArq := aDirAux[nAtual][1]
	
	//Copia o arquivo do Servidor para a máquina do usuário
	CpyS2T(cDirSrv+cNomArq, cDirUsr)
Next nAtual

E por último, utilizamos a função WaitRun (veja WaitRun no TDN), para realizar a cópia utilizando um comando do MS-DOS no AdvPL, no caso, o comando é o XCOPY (dúvidas sobre o comando, clique aqui), que pode inclusive realizar cópias entre servidores, desde que se tenha acesso, que é o nosso exemplo, utilizamos uma cópia utilizando \\ para acessar o servidor.

WaitRun("XCOPY " +cDirFull+ "*.pdf " + cDirUsr +" /y")

Update 18/06/2016:

Abaixo o trecho de código para copiar arquivos da estação para o servidor (sugestão do Felipe Pelegrini):

	cDirServ  := "\x_arquivos\"
	cDirLocal := "E:\"
	cArquivo  := "teste.txt"
	
	//Copiando o arquivo via __CopyFile (nesse é possível alterar o nome do arquivo de destino, por exemplo, teste2.txt)
	__CopyFile(cDirLocal+cArquivo, cDirServ+cArquivo+"2")
	
	//Copiando o arquivo via CpyT2S
	CpyT2S(cDirLocal+cArquivo, cDirServ)

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

6 Responses

  1. FELIPE PELEGRINI disse:

    em ambas as funções o arquivo é copiado do Servidor para o Client…. eu consigo copiar o arquivo do CLient para o Servidor? vou validar extensão e tamanho antes disso, mas é anexo.

    • Dan_Atilio disse:

      Boa tarde Felipe, tudo bem?
      Atualizei a postagem, para também realizar cópias da estação para o servidor, você pode utilizar tanto a __CopyFile como a CpyT2S. Abaixo o exemplo:

      	cDirServ  := "\x_arquivos\"
      	cDirLocal := "E:\"
      	cArquivo  := "teste.txt"
      	
      	//Copiando o arquivo via __CopyFile (nesse é possível alterar o nome do arquivo de destino, por exemplo, teste2.txt)
      	__CopyFile(cDirLocal+cArquivo, cDirServ+cArquivo+"2")
      	
      	//Copiando o arquivo via CpyT2S
      	CpyT2S(cDirLocal+cArquivo, cDirServ)
      

      Caso precise, ambas retornam .T. ou .F.
      Se tiver outras sugestões, pode entrar em contato.
      Um grande abraço.

  2. como faço para copiar arquivos no MAC?

  3. Anderson disse:

    Muito bom. Há alguma forma de copiar um arquivo disponível em uma url publica para uma pasta no servidor?

Deixe uma resposta