2011-01-03 19 views
8

Estoy escribiendo un programa que usa un servidor ftp con credenciales. Estoy tratando de recuperar la lista de directorio del servidor, pero cuando llego a la línea:Conectando servidor ftp con credenciales

string line = reader.ReadLine(); 

la cadena que contiene sólo consigo: "No se puede abrir \" host:/LIB1 \ ""

Si trato de obtener otra línea, se lanza la siguiente excepción: El servidor remoto devolvió un error: (550) Archivo no disponible (por ejemplo, archivo no encontrado, sin acceso).

Estoy seguro (usando otra aplicación ftp) que el directorio 'lib1' existe en el servidor ftp y mis credenciales (nombre de usuario y contraseña) son correctas.

Aquí está mi código:

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


    } 

y lo uso como sigue:

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

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

¿Alguien puede detectar el problema?

+0

Una cuestión más general sobre cómo obtener un listado de directorios de un servidor FTP en C#: http://stackoverflow.com/questions/3298922/how-to-list -directory-contents-with-ftp-in-c –

+0

use la validación personalizada del certificado, consulte https://stackoverflow.com/questions/5109752/use-c-sharp-to-get-an-smtp-server- certificado – syed

+0

Esta pregunta no está clara, ¿está simplemente pidiendo una forma de conectarse a un servidor FTP con credenciales, o para que podamos depurar este código específico? ¿Está abierto a soluciones que usan bibliotecas, como [FluentFTP] (https://github.com/robinrodricks/FluentFTP)? ¿Leer la primera línea le da un resultado incorrecto (lo que dice en su segunda oración) o arroja una excepción (lo que implica cuando dice que la segunda llamada 'ReadLine' arroja * otra * excepción)? Aquí hay demasiado unfxably wrong; Voy a votar para cerrar. –

Respuesta

11

Mi solución:

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

Algunas mejoras a Abdul Waheed de answer:

  • Agregado using bloques para limpiar los FtpWebResponse y StreamReader objetos;
  • Reducción de la manipulación de cadenas:

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