2011-01-03 23 views
8

Piszę program korzystający z serwera FTP z poświadczeniami. Próbuję pobrać listy katalogów z serwera, ale kiedy się do linii:Łączenie serwera FTP z poświadczeniami

string line = reader.ReadLine(); 

ciąg że dostanę zawiera tylko: „Nie można otworzyć \” host: „”/LIB1 \

Jeśli spróbuję uzyskać kolejną linię, zostanie zgłoszony kolejny wyjątek: Serwer zdalny zwrócił błąd: (550) Plik niedostępny (np. Plik nie został znaleziony, brak dostępu).

Wiem na pewno (przy użyciu innej aplikacji ftp), że katalog "lib1" istnieje na serwerze ftp, a moje poświadczenia (nazwa użytkownika i hasło) są poprawne.

Oto mój kod:

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


    } 

i używam go w następujący sposób:

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

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

ktoś może rozpoznać ten problem?

+0

bardziej ogólne pytanie o uzyskanie listy katalogów z serwera FTP w C#: http://stackoverflow.com/questions/3298922/how-to-list -directory-content-with-ftp-in-c –

+0

użyj niestandardowego sprawdzania poprawności certyfikatu, zobacz https://stackoverflow.com/questions/5109752/use-c-sharp-to-get-an-smtp-server- certyfikat – syed

+0

To pytanie jest dość niejasne - czy po prostu pytasz o sposób połączenia się z serwerem FTP za pomocą poświadczeń, czy też do debugowania tego konkretnego kodu? Czy jesteś otwarty na rozwiązania wykorzystujące biblioteki, takie jak [FluentFTP] (https://github.com/robinrodricks/FluentFTP)? Czy odczytanie pierwszej linii daje niepoprawny wynik (co mówisz w drugim zdaniu) lub rzuca wyjątek (co sugerujesz, kiedy mówisz, że drugie wywołanie "ReadLine" rzuca * inny * wyjątek)? Tutaj jest za dużo nieusuwalnie błędnych; Głosuję, aby zamknąć. –

Odpowiedz

11

Moje rozwiązanie:

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

Niektóre udoskonalenia do Abdul Waheed na answer:

  • Dodany using bloki oczyścić FtpWebResponse i StreamReader obiektów;
  • Zmniejszone manipulacji ciąg:

    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; 
         } 
        } 
    } 
    
Powiązane problemy