2011-01-03 12 views
8

Ich schreibe ein Programm, das einen FTP-Server mit Anmeldeinformationen verwendet. Ich versuche, die Verzeichnisliste vom Server abgerufen werden, aber wenn ich auf die Linie erhalten:FTP-Server mit Anmeldeinformationen verbinden

string line = reader.ReadLine(); 

die Zeichenfolge, die ich enthält nur erhalten: host „Can not \ öffnen“: „“/lib1 \

Wenn ich versuche, eine andere Zeile zu erhalten, wird die nächste Ausnahme ausgelöst: Der Remote-Server hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z. B. Datei nicht gefunden, kein Zugriff).

Ich weiß sicher (mit einer anderen FTP-Anwendung), dass 'lib1' Verzeichnis auf dem FTP-Server existiert und meine Zugangsdaten (Benutzername und Passwort) korrekt sind.

Hier ist mein Code:

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(); 


    } 

Und ich benutze es wie folgt:

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

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

Kann jemand das Problem erkennen?

+0

Eine allgemeine Frage über ein Verzeichnis von einem FTP-Server in C# Auflistung bekommen: http://stackoverflow.com/questions/3298922/how-to-list -directory-contents-with-ftp-in-c –

+0

Verwenden Sie die benutzerdefinierte Überprüfung des Zertifikats, siehe https://stackoverflow.com/questions/5109752/use-c-sharp-to-get-an-smtp-server- Zertifikat – syed

+0

Diese Frage ist ziemlich unklar - fragen Sie einfach nach einer Möglichkeit, eine Verbindung zu einem FTP-Server mit Anmeldeinformationen herzustellen oder diesen spezifischen Code zu debuggen? Sind Sie offen für Lösungen mit Bibliotheken wie [FluentFTP] (https://github.com/robinrodricks/FluentFTP)? Liefert das Lesen der ersten Zeile ein falsches Ergebnis (was Sie im zweiten Satz sagen) oder eine Ausnahme (was Sie meinen, wenn Sie sagen, dass der zweite 'ReadLine' Aufruf * eine andere * Ausnahme auslöst)? Hier ist zu viel Unfixierbares falsch; Ich stimme zu schließen. –

Antwort

11

Meine Lösung:

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

Einige Verfeinerungen Abdul Waheed des answer:

  • Added using blockiert die FtpWebResponse und StreamReader Objekte zu bereinigen;
  • Reduzierte String-Manipulation:

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