c# - net - Cargar archivo y descargar archivo desde FTP
upload file to ftp folder c# (3)
Estoy intentando crear un programa que cargue / descargue archivos .exe
en un FTP
Intenté usar FtpWebRequest
, pero solo puedo cargar y descargar archivos .txt.
Luego encontré aquí una solución para descargar usando el WebClient
:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential("username", "password");
byte[] fileData = request.DownloadData("ftp://myFTP.net/");
FileStream file = File.Create(destinatie);
file.Write(fileData, 0, fileData.Length);
file.Close();
Esta solución funciona Pero vi que WebClient
tiene un método DownloadFile
que no funcionó. Creo que porque no funciona en FTP
solo en HTTP
. ¿Mi suposición es cierta? Si no, ¿cómo puedo hacer que funcione?
¿Y hay alguna otra solución para subir / descargar un archivo .exe
a ftp usando FtpWebRequest
?
Debe indicar si está cargando archivos de texto o binarios. Agregue la siguiente línea después de declarar e inicializar la solicitud:
request.UseBinary = true;
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.usebinary.aspx
Cargar es fácil ...
void Upload(){
Web client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
client.BaseAddress = "ftp://ftpsample.net/";
client.UploadFile("sample.txt", "sample.txt"); //since the baseaddress
}
La descarga también es fácil ... El código que hice a continuación usa BackgroundWorker (por lo que no congela la interfaz / aplicación cuando se inicia la descarga). Además, acorté el código con el uso de lambda (=>)
.
void Download(){
Web client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += (s, e) => {
client.DownloadFile("ftp://ftpsample.net/sample.zip", "sample.zip");
};
bg.RunWorkerCompleted += (s, e) => { //when download is completed
MessageBox.Show("done downloading");
download1.Enabled = true; //enable download button
progressBar.Value = 0; // reset progressBar
};
bg.RunWorkerAsync();
download1.Enabled = false; //disable download button
while (bg.IsBusy)
{
progressBar.Increment(1); //well just for extra/loading
Application.DoEvents(); //processes all windows messages currently in the message queue
}
}
También puede usar el método DownloadFileAsync para mostrar la descarga real del archivo de progreso:
client.DownloadFileAsync(new Uri("ftp://ftpsample.net/sample.zip"), "sample.zip");
client.DownloadProgressChanged += (s, e) =>
{
progressBar.Value = e.ProgressPercentage; //show real download progress
};
client.DownloadFileCompleted += (s, e) =>
{
progressBar.Visible = false;
// other codes after the download
};
//You can remove the ''while'' statement and use this ^
Tanto WebClient.UploadFile
como WebClient.DownloadFile
funcionan correctamente tanto para FTP como para archivos binarios.
Subir
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 WebClient
no ofrece (como cifrado TLS / SSL, modo de transferencia ascii / texto, etc.), utilice 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
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 WebClient
no ofrece (como cifrado TLS / SSL, modo de transferencia ascii / texto, etc.), utilice 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 .