C # Baixe todos os arquivos e subdiretórios via FTP

Informações gerais
Eu ainda estou no processo de aprender C #. Para me ajudar, estou tentando criar um programa que sincronize automaticamente todos os meus projetos locais com uma pasta no meu servidor FTP. Isso para que eu esteja na escola ou em casa, sempre tenho os mesmos projetos disponíveis para mim.

Eu sei que existem programas como o Dropbox que já fazem isso por mim, mas imaginei que criar algo assim me ensinaria muito ao longo do caminho.

O problema
Meu primeiro passo em direção ao meu objetivo foi apenas baixar todos os arquivos, subdiretórios e subarquivos do meu servidor FTP. Consegui baixar todos os arquivos de um diretório com o código abaixo. No entanto, meu código lista apenas os nomes das pastas e os arquivos no diretório principal. Subpastas e subarquivos nunca são retornados e nunca são baixados. Além disso, o servidor retorna um erro 550 porque estou tentando baixar as pastas como se fossem arquivos. Estou nisso há mais de 4 horas, mas não consigo encontrar nada sobre como corrigir esses problemas e fazê-lo funcionar. Por isso, espero que vocês me ajudem :)

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");
    }
}

questionAnswers(1)

yourAnswerToTheQuestion