ComponentPro is a professional suite of libraries for FTP, sFTP and document manipulations (Word, Excel, PDF, …).

Here is a simple example of how to use it with (s)FTP.

using ComponentPro.IO;
using ComponentPro.Net;
using System;
using System.IO;
using System.Threading.Tasks;

namespace FtpTest
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var hostAddress = "MY.SFTP.SERVER";
            var port = 22;
            var userName = "MY.U$erN@mE";
            var password = "MY.P@$$W0rD";
            var localFileName = "test.txt";

            if (!File.Exists(localFileName))
                await CreateFile(localFileName);

            await SendToFTP(hostAddress, port, userName, password, localFileName);

            Console.WriteLine("\r\nPress any key...");
            Console.ReadKey();
        }

        private static async Task CreateFile(string localFileName)
        {
            using (var sw = new StreamWriter(localFileName))
            {
                await sw.WriteLineAsync("Hello World !!!");
            }
        }

        public static async Task SendToFTP(string hostAddress, int port, string userName, string password, string localFileName)
        {
            Console.WriteLine($"Connecting to (s)FTP server {hostAddress}...");

            IRemoteFileSystem client = null;

            try
            {
                client = new Sftp(); //or Ftp()
                client.ReconnectionMaxRetries = 2;
                await client.ConnectAsync(hostAddress, port);
                await client.AuthenticateAsync(userName, password);
                Console.WriteLine(@"Connected!   \o/");

                await client.SetCurrentDirectoryAsync(@"/"); //Navigate to the root of the server (depending on the rights)
                //bool isFolderExist = await client.DirectoryExistsAsync("myFolder");

                Console.WriteLine($"Sending file {localFileName} to {hostAddress}");
                await client.UploadFileAsync(localFileName, localFileName);

                if (await client.FileExistsAsync(localFileName))
                    Console.WriteLine("The file has been sent successfully!");
                else
                    Console.WriteLine("Oops, the file has been lost somewhere...");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"An error occurred while sending the file:\r\n{ex.Message}\r\n");
            }
            finally
            {
                if (client != null)
                    client.Disconnect();
            }
        }
    }
}

Code language: C# (cs)