使用凭据连接ftp服务器

我正在编写一个使用带有凭据的ftp服务器的程序。 我正在尝试从服务器检索目录列表但是当我到达该行时:

string line = reader.ReadLine(); 

我得到的字符串只包含:“无法打开”主机:/ lib1 \“。”

如果我尝试获取另一行,则抛出下一个exception:远程服务器返回错误:(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"); 

谁能发现问题?

我的解决方案

 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'); } 

Abdul Waheed 回答的一些改进:

  • 添加了using块来清理FtpWebResponseStreamReader对象;
  • 减少字符串操作:

     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; } } }