Quiero eliminar una carpeta en FTP y sus archivos recursivamente.¿Cómo eliminar de forma recursiva una carpeta con los archivos dentro usando FtpWebRequest?
¿Algún código de ejemplo puedo implementar?
Quiero eliminar una carpeta en FTP y sus archivos recursivamente.¿Cómo eliminar de forma recursiva una carpeta con los archivos dentro usando FtpWebRequest?
¿Algún código de ejemplo puedo implementar?
pequeño ejemplo de Niza se puede encontrar aquí:
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx
En el ejemplo que se utiliza para dirigir la clase WebRequestMethods.Ftp.UploadFile
qué tipo de operación que quieren hacer.
Utilice el método WebRequestMethods.Ftp.RemoveDirectory una vez que tenga una manija en el directorio padre que desea borrar:
http://msdn.microsoft.com/en-us/library/system.net.webrequestmethods.ftp.aspx
primer lugar hay que enumerar todos los archivos en el directorio:
public static List<string> DirectoryListing(string Path, string ServerAdress, string Login, string Password)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path);
request.Credentials = new NetworkCredential(Login, Password);
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
List<string> result = new List<string>();
while (!reader.EndOfStream)
{
result.Add(reader.ReadLine());
}
reader.Close();
response.Close();
return result;
}
Luego hay un método para eliminar un solo archivo (porque se puede eliminar una carpeta solamente si está vacío):
public static void DeleteFTPFile(string Path, string ServerAdress, string Login, string Password)
{
FtpWebRequest clsRequest = (System.Net.FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path);
clsRequest.Credentials = new System.Net.NetworkCredential(Login, Password);
clsRequest.Method = WebRequestMethods.Ftp.DeleteFile;
string result = string.Empty;
FtpWebResponse response = (FtpWebResponse)clsRequest.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
Y, por último:
public static void DeleteFTPDirectory(string Path, string ServerAdress, string Login, string Password)
{
FtpWebRequest clsRequest = (System.Net.FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path);
clsRequest.Credentials = new System.Net.NetworkCredential(Login, Password);
List<string> filesList = DirectoryListing(Path, ServerAdress, Login, Password);
foreach (string file in filesList)
{
DeleteFTPFile(Path + file, ServerAdress, Login, Password);
}
clsRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
string result = string.Empty;
FtpWebResponse response = (FtpWebResponse)clsRequest.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
se le puede llamar fácilmente esto como que (para mí esos métodos están en una clase llamada "ftp"):
Ftp.DeleteFTPDirectory (the_path_of_your_folder_in_ftp, your_server_address, your_ftp_login, your_ftp_password);
Por supuesto, tendrá que personalizar esas líneas, pero funcionó perfectamente para mí :)
No hay apoyo para las operaciones recursivas de la FtpWebRequest
class (o cualquier otra aplicación FTP en el marco .NET). Usted tiene que poner en práctica la recursividad a sí mismo:
parte difícil es identificar archivos de subdirectorios. No hay forma de hacerlo de una manera portátil con el FtpWebRequest
. Desafortunadamente, el FtpWebRequest
no es compatible con el comando MLSD
, que es la única forma portátil de recuperar la lista de directorios con atributos de archivos en el protocolo FTP. Vea también Checking if object on FTP server is file or directory.
Las opciones son:
LIST
command = ListDirectoryDetails
method) e intente analizar una lista específica del servidor. Muchos servidores FTP usan la lista * nix-style, donde identifica un directorio por el d
al principio de la entrada. Pero muchos servidores usan un formato diferente. El siguiente ejemplo usa este enfoque (asumiendo el formato * nix).static void DeleteFtpDirectory(string url, NetworkCredential credentials)
{
FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url);
listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
listRequest.Credentials = credentials;
List<string> lines = new List<string>();
using (FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse())
using (Stream listStream = listResponse.GetResponseStream())
using (StreamReader listReader = new StreamReader(listStream))
{
while (!listReader.EndOfStream)
{
lines.Add(listReader.ReadLine());
}
}
foreach (string line in lines)
{
string[] tokens =
line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
string name = tokens[8];
string permissions = tokens[0];
string fileUrl = url + name;
if (permissions[0] == 'd')
{
DeleteFtpDirectory(fileUrl + "/", credentials);
}
else
{
FtpWebRequest deleteRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile;
deleteRequest.Credentials = credentials;
deleteRequest.GetResponse();
}
}
FtpWebRequest removeRequest = (FtpWebRequest)WebRequest.Create(url);
removeRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
removeRequest.Credentials = credentials;
removeRequest.GetResponse();
}
El url
debería ser como ftp://example.com/directory/to/delete/
o utilizar una biblioteca de 3 ª parte que soporta las operaciones recursivas.
Por ejemplo, con WinSCP .NET assembly puede eliminar directorio completo con una sola llamada a Session.RemoveFiles
:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "example.com",
UserName = "user",
Password = "mypassword",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Delete folder
session.RemoveFiles("/home/user/foldertoremove").Check();
}
Internamente, WinSCP utiliza el comando MLSD
, si es compatible con el servidor. De lo contrario, usa el comando LIST
y admite docenas de formatos de listado diferentes.
(yo soy el autor de WinSCP)
Ninguna de las soluciones realmente trabajado en diferentes tipos de servidores, excepto usando System.Net.FtpClient
using System.Net.FtpClient;
static void DeleteFtpDirectoryAndContent(string host, string path, NetworkCredential credentials, string dontDeleteFileUrl)
{
using (FtpClient conn = new FtpClient())
{
conn.Host = host;
conn.Credentials = credentials;
foreach (FtpListItem item in conn.GetListing(path, FtpListOption.AllFiles | FtpListOption.ForceList))
{
switch (item.Type)
{
case FtpFileSystemObjectType.Directory:
conn.DeleteDirectory(item.FullName, true, FtpListOption.AllFiles | FtpListOption.ForceList);
break;
case FtpFileSystemObjectType.File:
if (!dontDeleteFileUrl.EndsWith(item.FullName, StringComparison.InvariantCultureIgnoreCase))
conn.DeleteFile(item.FullName);
break;
}
}
}
}
He acaba de publicar una respuesta existe en este post http://stackoverflow.com/questions/4797508/c-sharp-how-can-ftpclient-delete-a-directory/22623620#22623620 –