2010-07-21 42 views
29

¿Cómo enumerar los contenidos del directorio con FTP en C#?¿Cómo enumerar los contenidos del directorio con FTP en C#?

Estoy usando el código siguiente para mostrar el contenido del directorio con FTP, está devolviendo el resultado en formato XML, pero solo quiero el nombre del directorio y no el contenido completo.

¿Cómo puedo hacer eso?

public class WebRequestGetExample 
{ 
    public static void Main() 
    { 
     // Get the object used to communicate with the server. 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/"); 
     request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

     // This example assumes the FTP site uses anonymous logon. 
     request.Credentials = new NetworkCredential ("anonymous","[email protected]"); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 
     Console.WriteLine(reader.ReadToEnd()); 

     Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription); 

     reader.Close(); 
     response.Close(); 
    } 
} 

MSDN

+0

me gustaría utilizar NameSearchCondition ("*. *", SearchConditionFileTypes.Directory) como el método de parámetros listDirectory condición de búsqueda de la [ftp final] (http://www.componentpro.com/ftp.net/) . Vea este ejemplo: http://www.componentpro.com/doc/ftp/ComponentPro.Net.Ftp.ListDirectory%28ComponentPro.IO.SearchCondition%29.htm – Peter

Respuesta

42

Prueba esto:

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri); 
ftpRequest.Credentials =new NetworkCredential("anonymous","[email protected]"); 
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse(); 
StreamReader streamReader = new StreamReader(response.GetResponseStream()); 

List<string> directories = new List<string>(); 

string line = streamReader.ReadLine(); 
while (!string.IsNullOrEmpty(line)) 
{ 
    directories.Add(line); 
    line = streamReader.ReadLine(); 
} 

streamReader.Close(); 

Me dio una lista de directorios ... todos los que figuran en la lista de directorios de cadena ... dime si eso es lo que necesitaba

+0

Hola, Tu código está devolviendo el resultado en formato XML. Solo quiero directorios del sistema remoto porque necesito vincular esos nombres de directorio a una vista en árbol. Obtener XML no funcionará para mí. –

+0

@swapnil ¿Funcionó mi código anterior (editado)? sólo curiosidad – mint

+0

Me devuelve [DIR] Swapnil. . . . . . . . . . . . . Jul 21 09:43 donde "Swapnil" es el nombre del directorio. No quiero todas las demás cosas, amigo, solo el nombre del directorio que tengo que mostrar en treeview. No puedo mostrar todos estos detalles en treeview. ¿Alguna sugerencia o modificación? –

1

Usted probablemente está buscando PrintWorkingDirectory

+2

PWD solo imprime el nombre del directorio de trabajo –

+0

Cuando estoy usando PrintWorkingDirectory me da error: "El comando FTP solicitado no se admite cuando se utiliza proxy HTTP" FtpWebRequest ftpRequest = (FtpWebRequest) WebRequest.Create (uri); ftpRequest.Credentials = new NetworkCredential ("...", "..."); ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse) ftpRequest.GetResponse(); // Error StreamReader streamReader = new StreamReader (response.GetResponseStream()); String sResult = streamReader.ReadToEnd(); streamReader.Cerca(); –

+0

@Kieren Johnstone: Eso es lo que entendí que quería ... – leppie

1

Es necesario ListDirectory que lista el contenido del directorio

EDIT: O puede utilizar esta biblioteca Chilkat que lo envuelve muy bien para usted

+0

ListDirectory también está enumerando los resultados en formato XML. Solo quiero directorios del sistema remoto porque necesito vincular esos nombres de directorio a una vista en árbol. Obtener XML no funcionará para mí. Gracias. –

+0

Ya he pasado por la biblioteca de Chilkat pero no quiero usar ningún tercero. Gracias. ¿Alguna otra sugerencia que tenga? –

+0

No creo que me devuelva nada excepto xml, pero podría estar equivocado. Puede que tenga que analizar el xml en texto a menos que pueda especificar httpwebresponse para devolver el texto sin formato. – w69rdy

1

Algunos servidores proxy a formatear el listado de directorios, por lo que es bastante difícil analizar confiablemente una lista de directorios a menos que pueda garantizar que el proxy no cambie

-1

Si desea enumerar el nombre de los archivos que están dentro del directorio, debe poner (reqFTP.Proxy = null;) antes de invocar (reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;).

Espero que esto te ayude!

0

forma más simple y más eficiente para obtener el directorio FTP Contenido:

var contents = GetFtpDirectoryContents (nueva Uri ("ftpDirectoryUri"), nuevo NetworkCredential ("nombre de usuario", "contraseña"));

public static List<string> GetFtpDirectoryContents(Uri requestUri, NetworkCredential networkCredential) 
    { 
     var directoryContents = new List<string>(); //Create empty list to fill it later. 
     //Create ftpWebRequest object with given options to get the Directory Contents. 
     var ftpWebRequest = GetFtpWebRequest(requestUri, networkCredential, WebRequestMethods.Ftp.ListDirectory); 
     try 
     { 
      using (var ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse()) //Excute the ftpWebRequest and Get It's Response. 
      using (var streamReader = new StreamReader(ftpWebResponse.GetResponseStream())) //Get list of the Directory Contentss as Stream. 
      { 
       var line = string.Empty; //Initial default value for line. 
       do 
       { 
        line = streamReader.ReadLine(); //Read current line of Stream. 
        directoryContents.Add(line); //Add current line to Directory Contentss List. 
       } while (!string.IsNullOrEmpty(line)); //Keep reading while the line has value. 
      } 
     } 
     catch (Exception) { } //Do nothing incase of Exception occurred. 
     return directoryContents; //Return all list of Directory Contentss: Files/Sub Directories. 
    } 

    public static FtpWebRequest GetFtpWebRequest(Uri requestUri, NetworkCredential networkCredential, string method = null) 
    { 
     var ftpWebRequest = (FtpWebRequest)WebRequest.Create(requestUri); //Create FtpWebRequest with given Request Uri. 
     ftpWebRequest.Credentials = networkCredential; //Set the Credentials of current FtpWebRequest. 

     if (!string.IsNullOrEmpty(method)) 
      ftpWebRequest.Method = method; //Set the Method of FtpWebRequest incase it has a value. 
     return ftpWebRequest; //Return the configured FtpWebRequest. 
    } 
Cuestiones relacionadas