Подключение ftp сервера с учетными данными - PullRequest
9 голосов
/ 03 января 2011

Я пишу программу, которая использует FTP-сервер с учетными данными. Я пытаюсь получить список каталогов с сервера, но когда попадаю в строку:

string line = reader.ReadLine();

строка, которую я получаю, содержит только: "Can't open \" host: / lib1 \ "."

Если я пытаюсь получить другую строку, выдается следующее исключение: удаленный сервер вернул ошибку: (550) файл недоступен (например, файл не найден, нет доступа).

Я точно знаю (с помощью другого приложения ftp), что на сервере ftp существует каталог 'lib1' и мои учетные данные (имя пользователя и пароль) верны.

Вот мой код:

 public class FTPClient
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string IpAddress { get; set; }
    public int Port { get; set; }

    public FTPClient(string _userName, string _password, string _address, int _port)
    {
        UserName = _userName;
        Password = _password;
        IpAddress = _address;
        Port = _port;
    }

    public void GetDirectoriesList(string _path)
    {           
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + 
        IpAddress + _path));
        request.UseBinary = true;
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Credentials = new NetworkCredential(UserName, Password);

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        string line = reader.ReadLine();
        while (line!=null)
        {
            ... //do something with line
            line = reader.ReadLine();
        }
        ...
        reader.Close();
        response.Close();


    }

И я использую это следующим образом:

FTPClient ftpClient = new FTPClient("user1", "pass1", "192.168.2.110", 21);

        string dirList = ftpClient.GetDirectoriesList("/lib1");

Может кто-нибудь определить проблему?

Ответы [ 2 ]

13 голосов
/ 12 декабря 2011

Мое решение:

public string[] GetDirectory()
{
    StringBuilder result = new StringBuilder();
    FtpWebRequest requestDir = (FtpWebRequest)WebRequest.Create("ftp://urserverip/");
    requestDir.Method = WebRequestMethods.Ftp.ListDirectory;
    requestDir.Credentials = new NetworkCredential("username", "password");
    FtpWebResponse responseDir = (FtpWebResponse)requestDir.GetResponse();
    StreamReader readerDir  = new StreamReader(responseDir.GetResponseStream());

    string line = readerDir.ReadLine();
    while (line != null)
    {
        result.Append(line);
        result.Append("\n");
        line = readerDir.ReadLine();
    }

    result.Remove(result.ToString().LastIndexOf('\n'), 1);
    responseDir.Close(); 
    return result.ToString().Split('\n');
}
8 голосов
/ 23 апреля 2015

Некоторые уточнения ответа Абдула Вахида :

  • Добавлены блоки using для очистки объектов FtpWebResponse и StreamReader;
  • Уменьшенные манипуляции со строками:

    private static string[] GetDirectoryListing()
    {
        FtpWebRequest directoryListRequest = (FtpWebRequest)WebRequest.Create("ftp://urserverip/");
        directoryListRequest.Method = WebRequestMethods.Ftp.ListDirectory;
        directoryListRequest.Credentials = new NetworkCredential("username", "password");
    
        using (FtpWebResponse directoryListResponse = (FtpWebResponse)directoryListRequest.GetResponse())
        {
            using (StreamReader directoryListResponseReader = new StreamReader(directoryListResponse.GetResponseStream()))
            {
                string responseString = directoryListResponseReader.ReadToEnd();
                string[] results = responseString.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
                return results;
            }
        }
    }
    
...