FTP Vb.net

Senhores boa tarde,

Preciso de um help, surgiu a necessidade em realizar um download via FTP sem salvar em um diretório local e realizar o upload em outro FTP. É possível?

Estou nessa o dia todo, e não rolou, estou dando manutenção em um sistema meio antigo escrito em VB .net

Não vou postar um exemplo do que fiz, pois realizei diversos testes sem sucesso!

Alguém poderia me dar uma luz de como resolver isso? com exemplos.

Obrigado e fico no aguardo

Não procurou na documentação do .NET? Primeiros resultados…

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-download-files-with-ftp

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp

Só passar o stream do código de download pro código de upload que deve funcionar.

Bom dia Kronal, Obrigado pelo retorno

Realizei a implementação abaixo e me deu erro ao tentar ler em ‘arquivo.ReadToEnd()’

'System.ArgumentException: ‘Caracteres inválidos no caminho.’

Minha implementação está correta?

Private Sub Download()

    Dim request As FtpWebRequest
    Dim stream As Stream
    Dim response As FtpWebResponse
    Dim reader As StreamReader

    request = CType(FtpWebRequest.Create(New Uri(ftpuri2)), FtpWebRequest)
    request.Credentials = New NetworkCredential(ftpusername2, ftppassword2)
    request.Method = WebRequestMethods.Ftp.DownloadFile

    response = CType(request.GetResponse(), FtpWebResponse)
    stream = response.GetResponseStream()
    reader = New StreamReader(stream)

    Upload(reader)

    response.Close()
End Sub

Private Sub Upload(ByVal arquivo As StreamReader)

    Dim request As FtpWebRequest

    request = WebRequest.Create(ftpuri)
    request.Credentials = New NetworkCredential(ftpusername, ftppassword)
    request.Method = WebRequestMethods.Ftp.UploadFile

    Dim bFile() As Byte = System.IO.File.ReadAllBytes(arquivo.ReadToEnd())
    Dim clsStream As System.IO.Stream = request.GetRequestStream()

    clsStream.Write(bFile, 0, bFile.Length)
    clsStream.Close()
    clsStream.Dispose()

End Sub

Mas a ideia é bem essa, passar o stream do downloader pro uploader, bem como você fez.

Veja bem o que está acontecendo. Primeiro que nada o nome arquivo está confundindo as coisas, pois a variavel não é de arquivo mas um StreamReader com os dados baixados.

Segundo que arquivo.ReadToEnd() retorna um string contendo os dados que foram baixados, se você esta baixando uma pagina web ai vai ter um string com o conteúdo da pagina, por exemplo. E dai você usou System.IO.File.ReadAllBytes() nesse string, mas ReadAllBytes é feito para receber um nome de arquivo.

Minha dica é: Use sempre o debugger pra ver o que está acontecendo e se você está passando as coisas que os métodos esperam.


Beleza então é basicamente se livrar de tentar ler um arquivo com ReadAllBytes().

Porém você vai ver que os tipos não batem e StreamReader não retorna um array de bytes como você precisa.

Acho que a solução melhor é no seu Download() passar diretamente o stream pro usando Upload(stream). Dai a variavel streamreader fica sem uso e pode apagar. E no Download() mudar obviamente a assinatura pro tipo certo (e já muda o nome do parametro que não é um arquivo mas um stream), e passa a usar stream.ReadBytes() para dai sim obter o array de bytes que você precisa.

Qualquer coisa só ver a documentação desses tipos online.