How to recursively delete FTP directory using C# and System.Net

Using “Simple C# FTP Class” (see in linkografia) is possible delete recursively dir in ftp server.

class ftpClient

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Data;

namespace Informaticapressapochista
{
    public class ftpClient
    {
        private string host = null;
        private string user = null;
        private string pass = null;
        private FtpWebRequest ftpRequest = null;
        private FtpWebResponse ftpResponse = null;
        private Stream ftpStream = null;
        private int bufferSize = 2048;

        public ftpClient(string hostIP, string userName, string password)
        { host = hostIP; user = userName; pass = password; }


        public void DeleteFile(string deleteFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + deleteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex) { throw ex; }
            return;
        }

        public string[] directoryListDetailed(string directory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string directoryRaw = null;
                try { while (ftpReader.Peek() != -1) { directoryRaw += ftpReader.ReadLine() + "|"; } }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                try
                {
                    if (directoryRaw == null)
                        directoryRaw = string.Empty;
                    string[] directoryList = directoryRaw.Split("|".ToCharArray());
                    return directoryList;
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw ex;
            }
            return new string[] { "" };
        }

        public void deleteDirectory(string directoryName)
        {
            try
            {
                var direcotryChildren = directoryListSimple(directoryName);
                if (direcotryChildren.Any() && (!string.IsNullOrWhiteSpace(direcotryChildren[0])))
                {
                    foreach (var child in direcotryChildren)
                    {
                        if (child.Trim().Length > 0)
                        {
                            string mFileName = child;
                            if (mFileName.Contains(@"/"))
                            {
                                string[] mFileNameNew = mFileName.Split('/');
                                mFileName = mFileNameNew[mFileNameNew.Length - 1];
                            }
                            DeleteFile(directoryName + @"/" + mFileName);
                        }
                    }
                }
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + directoryName);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex) { throw ex; }
            return;
        }
    }
..........
}

Main

...
  ftpClient m_ftpClient = new ftpClient(<host>, <user>, <password>);
  DataTable m_Dtbl = new DataTable();
  m_Dtbl.Columns.Add("path", typeof(string));
  m_Dtbl.Columns.Add("lenght", typeof(int));
  string[] listadir=m_ftpClient.directoryListDetailed(<path to delete>);
  for (int i = 0; i < listadir.Length; i++)
  {
    string m_Item = listadir[i];
    if (m_Item.Trim().Length > 0)
    {
      if (m_Item.Substring(0, 1) == "d")
      {
        string[] splittato = m_Item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        string m_nomedir = splittato[8];
        DataRow m_NewRow = m_Dtbl.NewRow();
        m_NewRow["path"] = @"/FTP_CAM/CAMSPOGL/" + splittato[8];
        m_NewRow["lenght"] = ((string)m_NewRow["path"]).Length;
        m_Dtbl.Rows.Add(m_NewRow);
      }
    }
  }

  bool sentinel=true;
  while (sentinel)
  {
    sentinel = false;
    DataTable mDtblDupli = m_Dtbl.Copy();
    foreach (DataRow m_DR in mDtblDupli.Rows)
    {
      string m_pathcorrente = (string)m_DR["path"];
      string[] m_NewList = m_ftpClient.directoryListDetailed(m_pathcorrente);
      for (int i = 0; i < m_NewList.Length; i++)
      {
        string m_Item = m_NewList[i];
        m_Item = m_Item.Trim();
        if (m_Item.Length > 0)
        {
          string[] splittato = m_Item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
          if (m_Item.Substring(0, 1) == "d")
          {
            if (m_Dtbl.Select("path like'"+m_pathcorrente+@"/"+splittato[8]+"'").Lenght == 0)
            {
              sentinel = true;
              DataRow m_NewRow = m_Dtbl.NewRow();
              m_NewRow ["path"] = m_pathcorrente + @"/" + splittato[8];
              m_NewRow ["lenght"] = ((string)NewRow ["path"]).Length;
              m_Dtbl.Rows.Add(NewRow);
            }
          }
        }
      }
    }
  }

  foreach (DataRow mDR in m_Dtbl.Select("","lenght DESC"))
  {
    m_ftpClient.deleteDirectory((string)mDR["path"]);
  }
}

sorry if the solution is not very elegant……just remember that I still was a noob…….

Linkografia
Simple C# FTP Class – CodeProject