Я пытался загрузить файл FTP, используя C#, и у меня были различные проблемы. То, чего я хочу достичь, - это показать прогресс загрузки в прогрессбар. Важно, чтобы я использовал Windows Form и. Net.
Я пробовал два кода;
Мой первый код работает отлично, то есть я могу без проблем загрузить файл FTP.
КОД 1
FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(ficFTP));
dirFtp.KeepAlive = true;
dirFtp.UsePassive = UsePassive;
dirFtp.UseBinary = UseBinary;
// Los datos del usuario (credenciales)
NetworkCredential cr = new NetworkCredential(user, pass);
dirFtp.Credentials = cr;
FtpWebResponse response = (FtpWebResponse)dirFtp.GetResponse();
long size = (long)response.ContentLength;
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
using (FileStream writer = new FileStream(dirLocal, FileMode.Create))
{
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);
}
}
lblDescarga.Text = "¡Downloaded!";
reader.Close();
response.Close();
Проблема с этим кодом
Моя проблема с этим кодом заключается в том, что я не могу получить размер файла FTP, чтобы можно было использовать progressBar Теоретически этот раздел кода сообщал бы мне размер моего файла, но он всегда возвращает -1:
long size = (long)response.ContentLength;
Поскольку это не сработало, как я хотел, я сделал сообщение, и люди рекомендовали это решение FtpWebRequest FTP скачать с ProgressBar :
КОД 2
try
{
const string url = "ftp://185.222.111.11:21/patch/archive.zip";
NetworkCredential credentials = new NetworkCredential("user", "pass");
// Query size of the file to be downloaded
WebRequest sizeRequest = WebRequest.Create(url);
sizeRequest.Credentials = credentials;
sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize;
int size = (int)sizeRequest.GetResponse().ContentLength;
progressBar1.Invoke(
(MethodInvoker)(() => progressBar1.Maximum = size));
// Download the file
WebRequest request = WebRequest.Create(url);
request.Credentials = credentials;
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\tmp\archive.zip"))
{
byte[] buffer = new byte[10240];
int read;
while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, read);
int position = (int)fileStream.Position;
progressBar1.Invoke(
(MethodInvoker)(() => progressBar1.Value = position));
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
Проблема с этим кодом
Проблема с этим кодом заключается в следующем:
int size = (int) sizeRequest.GetResponse (). ContentLength;
Ошибка удаленного сервера: (550) Файл недоступен (например, файл не найден или не доступен).
Правда в том, что невозможно сказать, что у вас нет разрешения, если код 1 работает хорошо. Однако у меня есть нормальные разрешения в FTP, может кто-нибудь подсказать, пожалуйста?