2009-05-13 22 views
56

¿Cuál es una manera fácil de crear un directorio en un servidor FTP usando C#?¿Cómo creo un directorio en el servidor ftp usando C#?

me di cuenta de cómo cargar un archivo a una carpeta ya existente como esto:

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

Sin embargo, si quiero subir a users/abrien, consigo un WebException diciendo que el archivo no está disponible. Supongo que es porque necesito crear la nueva carpeta antes de cargar mi archivo, pero WebClient no parece tener ningún método para lograrlo.

Respuesta

90

Use FtpWebRequest, con un método de WebRequestMethods.Ftp.MakeDirectory.

Por ejemplo:

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

¿Alguna idea sobre cómo hacer esto a través de un proxy HTTP? (no es compatible con FtpWebRequest) –

+0

En realidad, no me temo. Por lo que recuerdo de mis días trabajando en proxies HTTP, ellos traducen los métodos HTTP en comandos FTP, y no puedo pensar en un método HTTP equivalente :( –

+12

¿Es posible crear directorios anidados con una WebRequest? Estoy tratando de hacer "ftp://host.com/ExistingFolder/new1/new2", pero obtengo "WebException - 550" (archivo no encontrado, sin acceso) y no sé si el clima es este. –

16

Algo como esto:

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

(un poco tarde de lo extraño..)

+14

+1 por solo un segundo detrás de Jon Skeet – Rudi

25

Aquí está la respuesta si desea crear directorios anidados

No hay una forma clara de comprobar si existe una carpeta en el ftp, por lo que debe crear un bucle y crear e toda la estructura de una carpeta anidada en el 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

Muy bueno y útil –

+0

¿Qué hacen los dos últimos parámetros? No se utilizan en el cuerpo del método. Utilicé el método sin la última t wo parámetro, pero solo pude gestionar crear un directorio anidado hasta 2 niveles, después de eso obtuve el error 505. –

+0

devuelve un error como: El servidor remoto devolvió un error: (550) Archivo no disponible (por ejemplo, archivo no encontrado, sin acceso) .Plz Help Me ... –

Cuestiones relacionadas