Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
1

Загрузить/скачать файл по FTP протоколу

23.03.2016, 13:14. Показов 6000. Ответов 11
Метки ftp (Все метки)

Author24 — интернет-сервис помощи студентам
Господа, будьте добры, необходим рабочий пример. Заранее всем большое спасибо! Не могу найти нормальный рабочий пример..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2016, 13:14
Ответы с готовыми решениями:

Прочитать текстовый файл по FTP-протоколу
Здравствуйте, есть небольшой вопрос, можно ли прочитать файл с FTP-сервера(сайта)(Есть доступ к...

Как загрузить файл на сервер (Доступ по FTP приветствуется)
Всем доброго времени суток. У меня возникла необходимость залить файл на сервер используя FTP или...

Из ftp скачать файл и отправить по почте
Всем доброго времени суток! Прошу помощи у знающих. Есть фтп сервер, нужно в автоматическом режиме...

C#: Загрузка файлов по FTP-протоколу
Подскажите, пожалуйста, как реализовать загрузку файлов на свой сервер по протоколу FTP? У меня...

11
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
23.03.2016, 15:06 2
https://msdn.microsoft.com/ru-... 10%29.aspx
0
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
24.03.2016, 07:19  [ТС] 3
Большое спасибо, но этот вариант уже пробовал. Выдает 530 ошибку "Удаленный сервер возвратил ошибку: (530) Вход не выполнен". Хотя через обычный батник, все работает.
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
24.03.2016, 07:46 4
ember74, значит ты сделал что-то не так. Как вариант логин/пароль неверный указал или ещё чего. Код в студию предоставь.
0
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
24.03.2016, 08:44  [ТС] 5
Цитата Сообщение от Usaga Посмотреть сообщение
Как вариант логин/пароль неверный указал или ещё чего
Я пробовал и на питоне приконнектиться, такая же ошибку, а батник работает. Навряд ли я копирую логин и пароль как то не так.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
 
namespace ftpClient
{
    class Program
    {
        static void Main(string[] args)
        {
            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://results.ru/chel/xl/Done/");
            ftpRequest.Credentials = new NetworkCredential("login", "pass");
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
           [B] FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();[/B] //ошибка на этой строке
            StreamReader streamReader = new StreamReader(response.GetResponseStream());
            List<string> directories = new List<string>();
 
            string line = streamReader.ReadLine();
            while (!string.IsNullOrEmpty(line))
            {
                directories.Add(line);
                line = streamReader.ReadLine();
            }
            streamReader.Close();
 
 
            using (WebClient ftpClient = new WebClient())
            {
                ftpClient.Credentials = new NetworkCredential("login", "pass");
 
                for (int i = 0; i <= directories.Count - 1; i++)
                {
                    if (directories[i].Contains("."))
                    {
 
                        string path = "ftp://results.ru/chel/xl/Done/" + directories[i].ToString();
                        string trnsfrpth = @"D:\download" + directories[i].ToString();
                        ftpClient.DownloadFile(path, trnsfrpth);
                    }
                }
            }
        }
    }
}
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
24.03.2016, 08:52 6
ember74, у FtpWebRequest есть особенность - он может подавить строкой пароля/логина, если та не нормализована.

Попробуй так:
C#
1
ftpRequest.Credentials = new NetworkCredential("login".Normalize(), "pass".Normalize());
0
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
24.03.2016, 08:58  [ТС] 7
Сейчас попробовал, та же самая ошибка на том же месте..
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
24.03.2016, 09:14 8
Я проверил твой код у себя на машине с подключением к своему же ftp-серверу - всё работает. Убедись, что ты правильно логин\пароль указал (в строке может быть экранирующий символ!).
0
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
24.03.2016, 09:18  [ТС] 9
Сейчас попробую. А еще сразу такой вопрос, а как скачать все файлы которые есть на фтп?
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
24.03.2016, 09:20 10
ember74, нужно будет перебрать все файлы на сервере и по одному их скачивать.
0
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
24.03.2016, 09:21  [ТС] 11
Цитата Сообщение от Usaga Посмотреть сообщение
нужно будет перебрать все файлы на сервере и по одному их скачивать.
А не подскажете как это сделать? Причем, скачивать нужно только файлы с расширение .res
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
24.03.2016, 09:36 12
ember74, можно использовать всеми горячо любимую рекурсию.

Вот первый попавшийся пример из гугла. Переделай его как тебе угодно:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
string[] files = GetFileList();
        foreach (string file in files)
        {
            Download(file);
        }
 
        public string[] GetFileList()
        {
            string[] downloadFiles;
            StringBuilder result = new StringBuilder();
            WebResponse response = null;
            StreamReader reader = null;
            try
            {
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                reqFTP.Proxy = null;
                reqFTP.KeepAlive = false;
                reqFTP.UsePassive = false;
                response = reqFTP.GetResponse();
                reader = new StreamReader(response.GetResponseStream());
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Append(line);
                    result.Append("\n");
                    line = reader.ReadLine();
                }
                // to remove the trailing '\n'
                result.Remove(result.ToString().LastIndexOf('\n'), 1);
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (response != null)
                {
                    response.Close();
                }                
                downloadFiles = null;
                return downloadFiles;
            }
        }
 
        private void Download(string file)
        {                       
            try
            {                
                string uri = "ftp://" + ftpServerIP + "/" + remoteDir + "/" + file;
                Uri serverUri = new Uri(uri);
                if (serverUri.Scheme != Uri.UriSchemeFtp)
                {
                    return;
                }       
                FtpWebRequest reqFTP;                
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + remoteDir + "/" + file));                                
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);                
                reqFTP.KeepAlive = false;                
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;                                
                reqFTP.UseBinary = true;
                reqFTP.Proxy = null;                 
                reqFTP.UsePassive = false;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream responseStream = response.GetResponseStream();
                FileStream writeStream = new FileStream(localDestnDir + "" + file, FileMode.Create);                
                int Length = 2048;
                Byte[] buffer = new Byte[Length];
                int bytesRead = responseStream.Read(buffer, 0, Length);               
                while (bytesRead > 0)
                {
                    writeStream.Write(buffer, 0, bytesRead);
                    bytesRead = responseStream.Read(buffer, 0, Length);
                }                
                writeStream.Close();
                response.Close(); 
            }
            catch (WebException wEx)
            {
                MessageBox.Show(wEx.Message, "Download Error");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Download Error");
            }
        }


Добавлено через 10 минут
ember74, я тебе ерунду скинул, извини. Вот пример нормального кода, который вернёт тебе массив адресов файлов на сервере. ПО этому массиву нужно будет пройтись в цикле и над каждой строкой сотворить Download. И никакой рекурсии))

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public static String[] FTPListTree(String FtpUri, String User, String Pass) {
 
    List<String> files = new List<String>();
    Queue<String> folders = new Queue<String>();
    folders.Enqueue(FtpUri);
 
    while (folders.Count > 0) {
        String fld = folders.Dequeue();
        List<String> newFiles = new List<String>();
 
        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(fld);
        ftp.Credentials = new NetworkCredential(User, Pass);
        ftp.UsePassive = false;
        ftp.Method = WebRequestMethods.Ftp.ListDirectory;
        using (StreamReader resp = new StreamReader(ftp.GetResponse().GetResponseStream())) {
            String line = resp.ReadLine();
            while (line != null) {
                newFiles.Add(line.Trim());
                line = resp.ReadLine();
            }
        }
 
        ftp = (FtpWebRequest)FtpWebRequest.Create(fld);
        ftp.Credentials = new NetworkCredential(User, Pass);
        ftp.UsePassive = false;
        ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        using (StreamReader resp = new StreamReader(ftp.GetResponse().GetResponseStream())) {
            String line = resp.ReadLine();
            while (line != null) {
                if (line.Trim().ToLower().StartsWith("d") || line.Contains(" <DIR> ")) {
                    String dir = newFiles.First(x => line.EndsWith(x));
                    newFiles.Remove(dir);
                    folders.Enqueue(fld + dir + "/");
                }
                line = resp.ReadLine();
            }
        }
        files.AddRange(from f in newFiles select fld + f);
    }
    return files.ToArray();
}
1
24.03.2016, 09:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2016, 09:36
Помогаю со студенческими работами здесь

Загрузить/скачать файл по FTP протоколу
Господа, будьте добры, необходим рабочий пример. Заранее всем большое спасибо!

Открыть ftp.exe, открыть соединение с FTP-сервером, залогиниться, загрузить файл в бинарном режиме и выйти
С помощью .bat мне нужно открыть ftp.exe, открыть соединение с ftp сервером, залогиниться, залить...

Загрузить файл по ftp
Пытаюсь загрузить html файл. Выскакивает ошибка: Необработанное исключение типа...

Загрузить файл с FTP-сервера
Нужно загрузить файл с удаленного сервера, именно загрузить потому что копирование запрещено...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru