2010-07-21 27 views
29

Comment lister le contenu du répertoire avec FTP en C#?Comment lister le contenu du répertoire avec FTP en C#?

J'utilise le code ci-dessous pour lister le contenu du répertoire avec FTP il renvoie le résultat au format XML, mais je ne veux que le nom du répertoire et pas tout le contenu.

Comment puis-je faire cela?

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

J'utiliser NameSearchCondition ("*. *", SearchConditionFileTypes.Directory) comme méthode paramètre listDirectory condition de recherche du [ftp final] (http://www.componentpro.com/ftp.net/) . Voir cet exemple: http://www.componentpro.com/doc/ftp/ComponentPro.Net.Ftp.ListDirectory%28ComponentPro.IO.SearchCondition%29.htm – Peter

Répondre

42

Essayez ceci:

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

Il m'a donné une liste de répertoires ... tous répertoriés dans la liste de chaînes de répertoires ... me dire si c'est ce que vous avez besoin

+0

Salut, Votre code renvoie le résultat au format XML Je ne veux que des répertoires système distants car j'ai besoin de lier ces noms de répertoires à une arborescence. Obtenir XML ne fonctionnera pas pour moi. –

+0

@swapnil Est-ce que mon code ci-dessus (édité) a fonctionné pour vous? juste curieux – mint

+0

Il me renvoie [DIR] Swapnil. . . . . . . . . . . . . Jul 21 09:43 où "Swapnil" est le nom du répertoire. Je ne veux pas que toutes les autres choses copient juste le nom du répertoire que je dois afficher dans treeview. Je ne peux pas montrer tous ces détails dans treeview. Des suggestions ou des modifications? –

1

Vous cherchez probablement PrintWorkingDirectory

+2

PWD affiche simplement le nom du répertoire de travail –

+0

Lorsque j'utilise PrintWorkingDirectory il me donne erreur: "La commande FTP demandée n'est pas prise en charge lors de l'utilisation du proxy HTTP" FtpWebRequest ftpRequest = (FtpWebRequest) WebRequest.Create (uri); ftpRequest.Credentials = new NetworkCredential ("...", "..."); ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse) ftpRequest.GetResponse(); // Erreur StreamReader streamReader = new StreamReader (response.GetResponseStream()); Chaîne sResult = streamReader.ReadToEnd(); streamReader.Fermer(); –

+0

@Kieren Johnstone: C'est ce que j'ai compris qu'il voulait ... – leppie

1

Vous avez besoin ListDirectory qui répertorie le contenu du répertoire

EDIT: Ou vous pouvez utiliser cette bibliothèque Chilkat qu'elle se termine bien pour vous

+0

ListDirectory répertorie également les résultats au format XML. Je ne veux que des répertoires système distants car j'ai besoin de lier ces noms de répertoires à une arborescence. Obtenir XML ne fonctionnera pas pour moi. Merci. –

+0

Ya je suis allé à travers la bibliothèque Chilkat mais je ne veux pas utiliser une 3ème partie. Merci. Avez-vous d'autres suggestions? –

+0

Je ne pense pas que ça va retourner tout sauf XML, mais je peux me tromper. Vous devrez peut-être juste analyser le xml en texte, sauf si vous pouvez spécifier le httpwebresponse pour retourner le texte brut? – w69rdy

1

Certaines procurations reformater la liste des répertoires, il est donc assez difficile d'analyser une liste de répertoires de manière fiable, sauf si vous pouvez garantir que le proxy ne change pas

-1

Si vous voulez lister le nom des fichiers qui se trouvent dans le répertoire, vous devez mettre (reqFTP.Proxy = null;) avant d'invoquer (reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;).

J'espère que cela peut vous aider!

0

plus simple et plus efficace d'obtenir FTP de répertoire:

var contenu = GetFtpDirectoryContents (nouveau Uri ("ftpDirectoryUri"), nouvelle NetworkCredential ("username", "password"));

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