… Continuação: BlackTDN :: ADVPL ~ Class TFTPClient : Combo II (Configurando o Servidor FTP)
Iniciamos, agora, o “Destrinchar” do exemplo proposto na série.
Comentaremos as partes mais significativas do programa deixando, para o leitor, a responsabilidade por desvendar as partes mais triviais.
Nos ateremos às funções; comandos; diretivas e macros do compilador; e aos métodos e propriedades da Classe TFTPClient.
A idéia base do exemplo é: Demonstrar que usando diretamente a Classe TFTPClient, em detrimento das funções FTP* teremos, através da análise do retorno do método GetLastResponse(), acesso a recursos de depuração que nos auxiliarão na resolução de possíveis problemas; além da possibilidade de usar diretamente os “sub-comandos” FTP para requisições ao invés dos métodos e/ou funções pré-definidos. Obviamente que é altamente recomendável a utilização desses dois últimos ao uso dos “sub-comandos” FTP. Mas é interessante saber de sua existência e a forma de uso uma vez que, dependendo dos recursos e “sub-comandos” existentes no servidor FTP, poderemos precisar executar alguma ação não implementada na Classe e/ou Funções.
Para a “Macro do Compilador” CRLF. CRLF é definida no arquivo de cabeçalho protheus.ch como: #define CRLF Chr(13)+Chr(10). Chamaremos CRLF de “Macro do Compilador” ao invés de “Constante Simbólica” pelo simples fato de Chr(13)+Chr(10) não serem constantes mas sim chamadas de função. O pré-processador do protheus substituirá, a cada ocorrência, CRLF por Chr(13)+Chr(10) que serão avaliadas no momento da execução. A “Macro do Compilador” CRLF poderia ser definida de várias formas a exemplo: #define CRLF() (Chr(13)+Chr(10)) ou #define PT_EOL() (Chr(13)+Chr(10)) Nos exemplos acima parametrizada como chamada a uma função. Vale lembrar que #define é sensível a letras maiúsculas e minúsculas. Se o pré-processador encontrar CrLf() ou PT_Eol() ele não fará a substituição e um erro, em tempo de execução, será disparado. Para evitar isso poderemos redefinir as “Macros do Compilador” usando as diretivas #translate ou #xtranslate. #translate CRLF() => (Chr(13)+Chr(10)) ou #xtranslate PT_EOL() => (Chr(13)+Chr(10)) e chamá-las como: Local cCRLF := CRLF() Local cPTEOL := PT_EOL() ou Local cCRLF := CrLf() Local cPTEOL := pt_EOL() que o pré-processador traduzirá, corretamente, para: Local cCRLF := (Chr(13)+Chr(10)) Local cPTEOL := (Chr(13)+Chr(10)) ou Local cCRLF := (Chr(13)+Chr(10)) Local cPTEOL := (Chr(13)+Chr(10)) |
Para as “Constantes Simbólicas” que definem os índices para os elementos do Array retornado pela função Directory(). Observe a definição das constantes em directry.ch: // Subscripts for DIRECTORY() array #define | F_NAME | 1 | #define | F_SIZE | 2 | #define | F_DATE | 3 | #define | F_TIME | 4 | #define | F_ATTR | 5 | | // Length of array | Elas facilitam a leitura do programa. Atente-se aos fragmentos de código abaixo. |
… continua
[]s
иαldσ dj
Naldo, sabe como subir o serviço de ftp no Protheus em modo passivo, ou alguma outra maneira? estou tendo dificuldades de transferência de arquivos...
ResponderExcluirSegundo o TDN: "A implementação atual do servidor de FTP não implementa o comando PASV (modo passivo)." (http://tdn.totvs.com.br/pages/viewpage.action?pageId=6064789)
ExcluirQue redundância "A implementação não implementa" (rs)
Já tentou com FileZilla ( https://filezilla-project.org/)?
ExcluirPorque: "A implementação não implementa a implementabilidade que deveria ser implementada" (kk)
Excluir