Cargue y descargue un archivo binario a / desde el servidor FTP en C # /. NET

Estoy usando .NET 4 C #. Estoy tratando de cargar y luego descargar un archivo ZIP a (mi) servidor.

Para cargarlo tengo

using (WebClient client = new WebClient()) { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(MyUrl); request.Method = WebRequestMethods.Ftp.UploadFile; request.EnableSsl = false; request.Credentials = new NetworkCredential(MyLogin, MyPassword); byte[] fileContents = null; using (StreamReader sourceStream = new StreamReader(LocalFilePath)) { fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); } request.ContentLength = fileContents.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } FtpWebResponse response = null; response = (FtpWebResponse)request.GetResponse(); response.Close(); } 

Esto parece funcionar, porque recibo un archivo en el servidor del tamaño correcto.

1) ¿Cómo puedo transmitirlo, en lugar de cargarlo primero en la memoria? Subiré archivos muy grandes.

Y para descargar, tengo

 using (WebClient client = new WebClient()) { string HtmlResult = String.Empty; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remoteFile); request.Method = WebRequestMethods.Ftp.DownloadFile; request.EnableSsl = false; request.Credentials = new NetworkCredential(MyLogin, MyPassword); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) using (FileStream writer = new FileStream(localFilename, FileMode.Create)) { long length = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[2048]; readCount = responseStream.Read(buffer, 0, bufferSize); while (readCount > 0) { writer.Write(buffer, 0, readCount); readCount = responseStream.Read(buffer, 0, bufferSize); } } } 

2) Todo parece funcionar … excepto cuando trato de descomprimir el archivo ZIP descargado obtengo un archivo ZIP no válido.

Subir

La forma más trivial de cargar un archivo binario en un servidor FTP utilizando .NET Framework es usar WebClient.UploadFile :

 WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

Si necesita un mayor control, que el WebClient no ofrece (como el cifrado TLS / SSL, etc.), use FtpWebRequest . La forma más fácil es simplemente copiar una secuencia de FileStream a FTP usando Stream.CopyTo :

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { fileStream.CopyTo(ftpStream); } 

Si necesita monitorear un progreso de carga, debe copiar los contenidos por partes usted mismo:

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { byte[] buffer = new byte[10240]; int read; while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0) { ftpStream.Write(buffer, 0, read); Console.WriteLine("Uploaded {0} bytes", fileStream.Position); } } 

Para el progreso de la GUI (WinForms ProgressBar ), consulte:
¿Cómo podemos mostrar la barra de progreso para cargar con FtpWebRequest?

Si desea cargar todos los archivos de una carpeta, consulte
Subir el directorio de archivos usando WebClient .


Descargar

La forma más trivial de descargar un archivo binario de un servidor FTP utilizando .NET Framework es usar WebClient.DownloadFile :

 WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); client.DownloadFile( "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

Si necesita un mayor control, que el WebClient no ofrece (como el cifrado TLS / SSL, etc.), use FtpWebRequest . La manera más fácil es simplemente copiar una secuencia de respuesta de FTP a FileStream utilizando Stream.CopyTo :

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.DownloadFile; using (Stream ftpStream = request.GetResponse().GetResponseStream()) using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) { ftpStream.CopyTo(fileStream); } 

Si necesita monitorear un progreso de descarga, debe copiar los contenidos por partes usted mismo:

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.DownloadFile; using (Stream ftpStream = request.GetResponse().GetResponseStream()) using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) { byte[] buffer = new byte[10240]; int read; while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, read); Console.WriteLine("Downloaded {0} bytes", fileStream.Position); } } 

Para el progreso de la GUI (WinForms ProgressBar ), consulte:
FtpWebRequest Descarga de FTP con ProgressBar

Si desea descargar todos los archivos de una carpeta remota, consulte
C # Descargar todos los archivos y subdirectorios a través de FTP .