Upload or Download files from SFTP

In this article, we'll cover three different scenarios for uploading files to an SFTP server using various libraries:

  1. Scenario 1: Using Renci.SshNet Library

  2. Scenario 2: Using WinSCP .NET Assembly

Scenario 1: Using Renci.SshNet Library

Upload a file to SFTP

To upload a file from an SFTP server using C#, you can use the SSH.NET library.

Install-Package Renci.SshNet
using Renci.SshNet;

class Program
{
    static void Main()
    {
        using (var client = new SftpClient("sftp.example.com", "username", "password"))
        {
            client.Connect();
            using (var fileStream = new FileStream("local-file.txt", FileMode.Open))
            {
                client.UploadFile(fileStream, "/remote-directory/remote-file.txt");
            }
            client.Disconnect();
        }
    }
}

Upload file that is in memory

using Renci.SshNet;
using System;

class Program
{
    static void Main()
    {
        string fileContents = "Hello, this is the content of the file!";
        byte[] fileContentsBytes = System.Text.Encoding.UTF8.GetBytes(fileContents);

        using (var client = new SftpClient("sftp.example.com", "username", "password"))
        {
            client.Connect();
            using (var memoryStream = new System.IO.MemoryStream(fileContentsBytes))
            {
                client.UploadFile(memoryStream, "/remote-directory/remote-file.txt");
            }
            client.Disconnect();
        }
    }

Download a file from SFTP into local

To download a file from an SFTP server using C#, you can use the SSH.NET library. Here's an example code snippet that demonstrates how to download a file from an SFTP server:

using Renci.SshNet;

public void DownloadFileFromSFTP(string host, int port, string username, string password, string remoteFilePath, string localFilePath)
{
    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();

        using (var fileStream = new FileStream(localFilePath, FileMode.Create))
        {
            client.DownloadFile(remoteFilePath, fileStream);
        }

        client.Disconnect();
    }
}

In this example, the DownloadFileFromSFTP method is used to download a file from an SFTP server. The method takes the following parameters:

  • host: The hostname or IP address of the SFTP server.

  • port: The port number of the SFTP server.

  • username: The username to authenticate with the SFTP server.

  • password: The password to authenticate with the SFTP server.

  • remoteFilePath: The path of the file to download on the SFTP server.

  • localFilePath: The path where the downloaded file will be saved on the local machine.

Inside the method, a new SftpClient object is created with the specified credentials and the Connect method is called to connect to the SFTP server.

A new FileStream object is created with the localFilePath and FileMode.Create parameters. This will create a new file or overwrite an existing file with the same name.

The DownloadFile method of the SftpClient class is called to download the file from the SFTP server and save it to the FileStream.

Finally, the Disconnect method is called to disconnect from the SFTP server.

To use this method, you can call it with the appropriate parameters like this:

DownloadFileFromSFTP("sftp.example.com", 22, "username", "password", "/path/to/remote/file.txt", "C:\\Downloads\\file.txt");

This will download the file /path/to/remote/file.txt from the SFTP server to C:\Downloads\file.txt on the local machine.

Download and read a text file from SFTP into a string

using Renci.SshNet;

public string ReadTextFileFromSFTP(string host, int port, string username, string password, string remoteFilePath)
{
    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();

        using (var memoryStream = new MemoryStream())
        {
            client.DownloadFile(remoteFilePath, memoryStream);
            string fileContents = Encoding.UTF8.GetString(memoryStream.ToArray());
            return fileContents;
        }

        client.Disconnect();
    }
}

In this example, the ReadTextFileFromSFTP method is used to read a text file from an SFTP server into a string. The method takes the following parameters:

  • host: The hostname or IP address of the SFTP server.

  • port: The port number of the SFTP server.

  • username: The username to authenticate with the SFTP server.

  • password: The password to authenticate with the SFTP server.

  • remoteFilePath: The path of the file to read on the SFTP server.

Inside the method, a new SftpClient object is created with the specified credentials and the Connect method is called to connect to the SFTP server.

A new MemoryStream object is created to hold the contents of the file.

The DownloadFile method of the SftpClient class is called to download the file from the SFTP server and save it to the MemoryStream.

The contents of the MemoryStream are then converted to a string using the Encoding.UTF8.GetString method.

Finally, the Disconnect method is called to disconnect from the SFTP server.

To use this method, you can call it with the appropriate parameters like this:

string fileContents = ReadTextFileFromSFTP("sftp.example.com", 22, "username", "password", "/path/to/remote/file.txt");

This will read the contents of the file /path/to/remote/file.txt on the SFTP server into a string.

Read a text file from SFTP into a string without downloading

using Renci.SshNet;

public string ReadTextFileFromSFTP(string host, int port, string username, string password, string remoteFilePath)
{
    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();

        var fileStream = client.OpenRead(remoteFilePath);
        var streamReader = new StreamReader(fileStream);
        var fileContents = streamReader.ReadToEnd();

        client.Disconnect();

        return fileContents;
    }
}

In this example, the ReadTextFileFromSFTP method is used to read a text file from an SFTP server into a string without downloading the entire file. The method takes the following parameters:

  • host: The hostname or IP address of the SFTP server.

  • port: The port number of the SFTP server.

  • username: The username to authenticate with the SFTP server.

  • password: The password to authenticate with the SFTP server.

  • remoteFilePath: The path of the file to read on the SFTP server.

Inside the method, a new SftpClient object is created with the specified credentials and the Connect method is called to connect to the SFTP server.

The OpenRead method of the SftpClient class is called to open a stream to the file on the SFTP server.

A new StreamReader object is created to read the stream line by line.

The ReadToEnd method of the StreamReader class is called to read the entire file into a string.

Finally, the Disconnect method is called to disconnect from the SFTP server.

To use this method, you can call it with the appropriate parameters like this:

string fileContents = ReadTextFileFromSFTP("sftp.example.com", 22, "username", "password", "/path/to/remote/file.txt");

This will read the contents of the file /path/to/remote/file.txt on the SFTP server into a string without downloading the entire file.

Read a file from SFTP into a binary array without downloading

using Renci.SshNet;

public byte[] ReadTextFileFromSFTP(string host, int port, string username, string password, string remoteFilePath)
{
    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();

        var fileStream = client.OpenRead(remoteFilePath);
        var buffer = new byte[4096];
        using (var memoryStream = new MemoryStream())
        {
            int bytesRead;
            do
            {
                bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                memoryStream.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);

            client.Disconnect();
            return memoryStream.ToArray();
        }
    }
}

In this example, the ReadTextFileFromSFTP method is used to read a text file from an SFTP server into a byte array without downloading the entire file. The method takes the following parameters:

  • host: The hostname or IP address of the SFTP server.

  • port: The port number of the SFTP server.

  • username: The username to authenticate with the SFTP server.

  • password: The password to authenticate with the SFTP server.

  • remoteFilePath: The path of the file to read on the SFTP server.

Inside the method, a new SftpClient object is created with the specified credentials and the Connect method is called to connect to the SFTP server.

The OpenRead method of the SftpClient class is called to open a stream to the file on the SFTP server.

A buffer of size 4096 bytes is created to read the file in chunks.

A new MemoryStream object is created to hold the contents of the file.

A loop is started to read the file in chunks and write each chunk to the MemoryStream.

Finally, the Disconnect method is called to disconnect from the SFTP server, and the contents of the MemoryStream are returned as a byte array using the ToArray method.

To use this method, you can call it with the appropriate parameters like this:

byte[] fileContents = ReadTextFileFromSFTP("sftp.example.com", 22, "username", "password", "/path/to/remote/file.txt");

This will read the contents of the file /path/to/remote/file.txt on the SFTP server into a byte array without downloading the entire file.

Scenario 2: Using WinSCP .NET Assembly

Uploading a File:

using WinSCP;

class Program
{
    static void Main()
    {
        SessionOptions sessionOptions = new SessionOptions
        {
            Protocol = Protocol.Sftp,
            HostName = "sftp.example.com",
            UserName = "username",
            Password = "password",
        };

        using (Session session = new Session())
        {
            session.Open(sessionOptions);
            TransferOptions transferOptions = new TransferOptions
            {
                TransferMode = TransferMode.Binary,
            };

            TransferOperationResult transferResult = session.PutFiles("local-file.txt", "/remote-directory/remote-file.txt", false, transferOptions);
            transferResult.Check();
        }
    }
}

Downloading a File:

csharpCopy codeusing WinSCP;

class Program
{
    static void Main()
    {
        SessionOptions sessionOptions = new SessionOptions
        {
            Protocol = Protocol.Sftp,
            HostName = "sftp.example.com",
            UserName = "username",
            Password = "password",
        };

        using (Session session = new Session())
        {
            session.Open(sessionOptions);
            TransferOptions transferOptions = new TransferOptions
            {
                TransferMode = TransferMode.Binary,
            };

            TransferOperationResult transferResult = session.GetFiles("/remote-directory/remote-file.txt", "downloaded-file.txt", false, transferOptions);
            transferResult.Check();
        }
    }
}

In these code examples, we covered uploading and downloading files to and from an SFTP server using the Renci.SshNet and WinSCP libraries. These examples serve as a starting point for implementing SFTP operations using different libraries in C#. Remember to replace placeholders like server details, paths, and authentication credentials with your actual information.