Загрузите FTP с помощью FtpWebRequest в Windows форме. Net - PullRequest
0 голосов
/ 14 апреля 2020

Я пытался загрузить файл 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, может кто-нибудь подсказать, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...