使用凭据连接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
块来清理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; } } }