2009-05-13 2 views
56

Qual è un modo semplice per creare una directory su un server FTP utilizzando C#?Come posso creare una directory sul server ftp usando C#?

ho capito come caricare un file in una cartella già esistente in questo modo:

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

Tuttavia, se voglio caricare users/abrien, ho un WebException dice che il file non è disponibile. Presumo che questo è dovuto al fatto che ho bisogno di creare la nuova cartella prima di caricare il mio file, ma l'WebClient non sembra avere alcun metodo per farlo.

risposta

90

Utilizzare FtpWebRequest, con un metodo di WebRequestMethods.Ftp.MakeDirectory.

Ad esempio:

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

Qualche idea su come farlo attraverso un proxy HTTP? (non supportato da FtpWebRequest) –

+0

Non proprio, temo. Da quello che ricordo dei miei giorni lavorando su proxy HTTP, traducono i metodi HTTP in comandi FTP - e non riesco a pensare a un metodo HTTP equivalente :( –

+12

È possibile creare directory annidate con una WebRequest? Sto cercando di fare "ftp://host.com/ExistingFolder/new1/new2", ma ottengo "WebException - 550" (File non trovato, nessun accesso) e non conosco il tempo questo è il motivo –

16

Qualcosa di simile a questo:

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

(un po 'tardi come strano..)

+14

+1 per essere solo un secondo dietro a Jon Skeet – Rudi

25

Ecco la risposta, se si desidera creare directory nidificate

Non esiste un modo pulito per verificare se esiste una cartella sul ftp, quindi è necessario eseguire il loop e creare e tutta la cartella struttura di quella annidata al momento

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

Molto buono e utile –

+0

Cosa fanno gli ultimi due parametri? Questi non sono usati nel corpo del metodo.Io ho usato il metodo senza l'ultimo t wo parametro, ma riuscivo solo a creare directory annidate fino a 2 livelli, dopo di che ho ottenuto l'errore 505. –

+0

restituisce un errore del tipo: Il server remoto ha restituito un errore: (550) File non disponibile (ad esempio, file non trovato, nessun accesso) .Plz Help Me .. –