2011-01-03 7 views
8

Sto scrivendo un programma che utilizza un server ftp con credenziali. Sto cercando di recuperare l'elenco di directory dal server, ma quando arrivo alla linea:Connessione server ftp con credenziali

string line = reader.ReadLine(); 

la stringa che ottengo contiene solo: "Impossibile aprire \" host:/lib1 \ ""

Se si tenta di ottenere un'altra riga, viene generata l'eccezione successiva: Il server remoto ha restituito un errore: (550) File non disponibile (ad es. File non trovato, nessun accesso).

So per certo (utilizzando un'altra applicazione ftp) che la directory 'lib1' esiste sul server ftp e le mie credenziali (nome utente e password) sono corrette.

Ecco il mio codice:

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


    } 

e lo uso come segue:

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

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

Qualcuno può individuare il problema?

+0

Una domanda più generale su come ottenere un elenco di directory da un server FTP in C#: http://stackoverflow.com/questions/3298922/how-to-list -directory-content-with-ftp-in-c –

+0

usa la convalida personalizzata del certificato, vedi https://stackoverflow.com/questions/5109752/use-c-sharp-to-get-an-smtp-server- certificato – syed

+0

Questa domanda non è chiara: stai semplicemente chiedendo un modo per connettersi a un server FTP con credenziali o per eseguire il debug di questo codice specifico? Sei aperto a soluzioni che utilizzano librerie, come [FluentFTP] (https://github.com/robinrodricks/FluentFTP)? Leggere la prima riga ti dà un risultato errato (cosa dici nella tua seconda frase) o lanciare un'eccezione (cosa intendi quando dici che la seconda chiamata "ReadLine" lancia * un'altra * eccezione)? Qui c'è troppa insondabile sbagliata; Sto votando per chiudere. –

risposta

11

La mia soluzione:

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

Alcuni affinamenti Abdul Waheed di answer:

  • Aggiunto using blocchi per ripulire gli oggetti FtpWebResponse e StreamReader;
  • ridotto manipolazione di stringhe:

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