2009-05-13 10 views
56

Quel est un moyen facile de créer un répertoire sur un serveur FTP en utilisant C#?Comment créer un répertoire sur un serveur FTP en utilisant C#?

Je compris comment télécharger un fichier dans un dossier déjà existant comme celui-ci:

using (WebClient webClient = new WebClient()) 
{ 
    string filePath = "d:/users/abrien/file.txt"; 
    webClient.UploadFile("ftp://10.128.101.78/users/file.txt", filePath); 
} 

Cependant, si je veux télécharger à users/abrien, je reçois un WebException indiquant que le fichier est indisponible. Je suppose que c'est parce que j'ai besoin de créer le nouveau dossier avant de télécharger mon fichier, mais WebClient ne semble pas avoir de méthodes pour y parvenir.

Répondre

90

Utilisez FtpWebRequest, avec une méthode de WebRequestMethods.Ftp.MakeDirectory.

Par exemple:

using System; 
using System.Net; 

class Test 
{ 
    static void Main() 
    { 
     WebRequest request = WebRequest.Create("ftp://host.com/directory"); 
     request.Method = WebRequestMethods.Ftp.MakeDirectory; 
     request.Credentials = new NetworkCredential("user", "pass"); 
     using (var resp = (FtpWebResponse) request.GetResponse()) 
     { 
      Console.WriteLine(resp.StatusCode); 
     } 
    } 
} 
+1

Des idées sur la façon de le faire via un proxy HTTP? (non supporté par FtpWebRequest) –

+0

Pas vraiment, j'ai peur. D'après ce que je me rappelle de mes jours de travail sur les proxies HTTP, ils traduisent les méthodes HTTP en commandes FTP - et je ne peux pas penser à une méthode HTTP équivalente :( –

+12

Est-il possible de créer des répertoires imbriqués avec une WebRequest? "ftp://host.com/ExistingFolder/new1/new2", mais je reçois "WebException - 550" (Fichier non trouvé, pas d'accès) et je ne sais pas la météo c'est la raison –

16

Quelque chose comme ceci:

// remoteUri points out an ftp address ("ftp://server/thefoldertocreate") 
WebRequest request = WebRequest.Create(remoteUri); 
request.Method = WebRequestMethods.Ftp.MakeDirectory; 
WebResponse response = request.GetResponse(); 

(un peu tard comment bizarre..)

+14

+1 pour juste être une seconde derrière Jon Skeet – Rudi

25

Voici la réponse si vous voulez créer des répertoires imbriqués

Il n'y a aucun moyen propre de vérifier si un dossier existe sur le ftp, donc vous devez boucler et créer e toute la structure imbriquée un dossier au moment

public static void MakeFTPDir(string ftpAddress, string pathToCreate, string login, string password, byte[] fileContents, string ftpProxy = null) 
    { 
     FtpWebRequest reqFTP = null; 
     Stream ftpStream = null; 

     string[] subDirs = pathToCreate.Split('/'); 

     string currentDir = string.Format("ftp://{0}", ftpAddress); 

     foreach (string subDir in subDirs) 
     { 
      try 
      { 
       currentDir = currentDir + "/" + subDir; 
       reqFTP = (FtpWebRequest)FtpWebRequest.Create(currentDir); 
       reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; 
       reqFTP.UseBinary = true; 
       reqFTP.Credentials = new NetworkCredential(login, password); 
       FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
       ftpStream = response.GetResponseStream(); 
       ftpStream.Close(); 
       response.Close(); 
      } 
      catch (Exception ex) 
      { 
       //directory already exist I know that is weak but there is no way to check if a folder exist on ftp... 
      } 
     } 
    } 
+0

Très bon et utile –

+0

Ce qui fait deux derniers paramètres? Ces derniers ne sont pas utilisés dans le corps de la méthode.J'ai utilisé la méthode sans le dernier t wo paramètre, mais ne pouvait que créer un répertoire imbriqué jusqu'à 2 niveau, après que j'ai eu erreur 505. –

+0

il renvoie une erreur comme: Le serveur distant a renvoyé une erreur: (550) Fichier indisponible (par exemple, fichier introuvable, pas d'accès) .Plz Aidez-moi .. –

Questions connexes