¿Cómo se crea un directorio en el servidor FTP usando C #?
Pregunta
¿Cuál es una manera fácil de crear un directorio en un servidor FTP usando C #?
Me di cuenta de cómo cargar un archivo en 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 esto se debe a que necesito para crear la nueva carpeta antes de subir mi archivo, pero WebClient
no parecen tener ningún método para lograrlo.
Solución
Uso 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);
}
}
}
Otros consejos
Aquí está la respuesta si desea crear directorios anidados
No hay manera limpia para comprobar si una carpeta existir en el ftp lo que tiene que bucle y crear toda la estructura anidada una carpeta 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...
}
}
}
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. Qué extraño.)
Creación de un directorio FTP podría ser complicado ya que hay que comprobar si existe la carpeta de destino o no. Puede que tenga que utilizar una biblioteca de FTP para comprobar y crear un directorio. Puede echar un vistazo a la siguiente: http://www.componentpro.com/ftp.net/ y este ejemplo: http: // www. componentpro.com/doc/ftp/Creating-a-new-directory-Synchronously.htm