from example descargar conexion archivos c# ftp ftpwebrequest ftpwebresponse

example - ftpwebrequest sftp c#



TamaƱo incorrecto del archivo de descarga FtpWebRequest (1)

Estoy usando el siguiente código para descargar un archivo desde un servidor ftp remoto:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath); request.KeepAlive = true; request.UsePassive = true; request.UseBinary = true; request.Method = WebRequestMethods.Ftp.DownloadFile; request.Credentials = new NetworkCredential(userName, password); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) using (StreamWriter destination = new StreamWriter(destinationFile)) { destination.Write(reader.ReadToEnd()); destination.Flush(); }

El archivo que estoy descargando es un dll y mi problema es que está siendo alterado por este proceso de alguna manera. Lo sé porque el tamaño del archivo está aumentando. Tengo la sospecha de que esta sección de código tiene la culpa:

destination.Write(reader.ReadToEnd()); destination.Flush();

¿Alguien puede ofrecer alguna idea sobre lo que puede estar mal?


StreamReader y StreamWriter funcionan con datos de caracteres, por lo que está decodificando la secuencia de bytes a caracteres y luego volviendo a codificarla en bytes. Un archivo dll contiene datos binarios, por lo que esta conversión de ida y vuelta introducirá errores. Desea leer los bytes directamente desde el objeto responseStream y escribir en un FileStream que no está StreamWriter en un StreamWriter .

Si usa .NET 4.0, puede usar Stream.CopyTo , pero de lo contrario deberá copiar la transmisión manualmente. Esta pregunta de tiene un buen método para copiar secuencias:

public static void CopyStream(Stream input, Stream output) { byte[] buffer = new byte[32768]; while (true) { int read = input.Read(buffer, 0, buffer.Length); if (read <= 0) return; output.Write(buffer, 0, read); } }

Por lo tanto, su código se verá así:

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (FileStream destination = File.Create(destinationFile)) { CopyStream(responseStream, destination); }