C # Descargar todos los archivos y subdirectorios a través de FTP

Información general
Todavía estoy en el proceso de aprender C #. Para ayudarme, estoy tratando de crear un programa que sincronice automáticamente todos mis proyectos locales con una carpeta en mi servidor FTP. Esto para que, ya sea que esté en la escuela o en casa, siempre tenga los mismos proyectos disponibles.

Sé que hay programas como Dropbox que ya hacen esto por mí, pero pensé que crear algo así me enseñaría mucho en el camino.

El problema
Mi primer paso hacia mi objetivo fue simplemente descargar todos los archivos, subdirectorios y subarchivos de mi servidor FTP. Me las arreglé para descargar todos los archivos de un directorio con el siguiente código. Sin embargo, mi código solo enumera los nombres de carpetas y los archivos en el directorio principal. Las subcarpetas y subfiles nunca se devuelven y nunca se descargan. Aparte de eso, el servidor devuelve un error 550 porque estoy tratando de descargar las carpetas como si fueran archivos. He estado en esto por más de 4 horas, pero no puedo encontrar nada sobre cómo solucionar estos problemas y hacer que funcione. Por lo tanto, espero que ustedes me ayuden :)

Código

public string[] GetFileList()
{
    string[] downloadFiles;
    StringBuilder result = new StringBuilder();
    WebResponse response = null;
    StreamReader reader = null;

    try
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
        request.UseBinary = true;
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
        request.KeepAlive = false;
        request.UsePassive = false;
        response = request.GetResponse();
        reader = new StreamReader(response.GetResponseStream());
        string line = reader.ReadLine();
        while (line != null)
        {
            result.Append(line);
            result.Append("\n");
            line = reader.ReadLine();
        }
        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        return result.ToString().Split('\n');
    }
    catch (Exception ex)
    {
        if (reader != null)
        {
            reader.Close();
        }
        if (response != null)
        {
            response.Close();
        }
        downloadFiles = null;
        return downloadFiles;
    }
}

private void Download(string file)
{
    try
    {
        string uri = url + "/" + file;
        Uri serverUri = new Uri(uri);
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return;
        }
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url + "/" + file);
        request.UseBinary = true;
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
        request.KeepAlive = false;
        request.UsePassive = false;
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream writeStream = new FileStream(localDestnDir + "\\" + file, FileMode.Create);                
        int Length = 2048;
        Byte[] buffer = new Byte[Length];
        int bytesRead = responseStream.Read(buffer, 0, Length);
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = responseStream.Read(buffer, 0, Length);
        }
        writeStream.Close();
        response.Close();
    }
    catch (WebException wEx)
    {
        MessageBox.Show(wEx.Message, "Download Error");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Download Error");
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta