C# SFTP client

  • In C#
  • Friday, January 08, 2016
  • 4233 Views

C# SFTP client

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using WinSCP;

 

namespace VinEcom.Oms.SFTP

{

    public class SFTPClient

    {

        #region private member

        private string remoteHost, remoteUser, remotePassword, sshHostKeyFingerprint, executablePath;

        private int remotePort, protocol;

        #endregion

 

        #region constructor

        public SFTPClient(string remoteHost, string remoteUser, string remotePass,

            int remotePort,

            string sshHostKeyFingerprint,

            int protocol = 1,

            string executablePath = null)

        {

            this.remoteHost = remoteHost;

            this.remoteUser = remoteUser;

            this.remotePassword = remotePass;

            this.remotePort = remotePort;

            this.sshHostKeyFingerprint = sshHostKeyFingerprint;

            this.protocol = protocol;

            if (string.IsNullOrWhiteSpace(executablePath) || executablePath == "null")

                this.executablePath = null;

            else

                this.executablePath = executablePath;

        }

        #endregion

 

        private SessionOptions CreateSessionOptions()

        {

            return new SessionOptions

            {

                Protocol = (Protocol)protocol,// must be protocol scp not sftp

                HostName = remoteHost,

                UserName = remoteUser,

                Password = remotePassword,

                PortNumber = remotePort,

                SshHostKeyFingerprint = sshHostKeyFingerprint,

 

                //FtpSecure = FtpSecure.Explicit

                //SessionOptions.Protocol is Protocol.Sftp or Protocol.Scp, but SessionOptions.SshHostKeyFingerprint is not set.

                //GiveUpSecurityAndAcceptAnySshHostKey = true //{"Cannot initialize SFTP protocol. Is the host running a SFTP server?"}

            };

        }

 

        #region public method

        ///

 

        /// Get File from remotePath to localPath using SFTP

        ///

        ///

        ///

        ///

        public bool GetFile(string remotePath, string localPath)

        {

            return DownloadFile(remotePath, localPath);

        }

 

        public bool CreateDirectory(string directoryPath)

        {

            try

            {

                using (Session session = new Session())

                {

                    SessionOptions sessionOptions = CreateSessionOptions();

 

                    session.ExecutablePath = executablePath;

                    // Connect

                    session.Open(sessionOptions);

 

 

                    session.CreateDirectory(directoryPath);

 

                    session.Close();

                    return true;

                }

            }

            catch (Exception exception)

            {

 

                throw exception;

            }

 

            //return false;

        }

 

        public void ListDirectory(string directoryName)

        {

            try

            {

                using (Session session = new Session())

                {

                    SessionOptions sessionOptions = CreateSessionOptions();

                    // Connect

                    session.Open(sessionOptions);

 

                    RemoteDirectoryInfo remoteDirectoryInfo = session.ListDirectory(directoryName);

                    //remoteDirectoryInfo.Files

                    session.Close();

                }

            }

            catch (Exception exception)

            {

 

                throw exception;

            }

 

        }

        ///

 

        /// Download File from remotePath to localPath using SFTP

        ///

        ///

        ///

        ///

        public bool DownloadFile(string remotePath, string localPath)

        {

            try

            {

                using (Session session = new Session())

                {

                    // Setup session options

                    SessionOptions sessionOptions = CreateSessionOptions();

                    // set executablePath WinSCP.exe

                    session.ExecutablePath = executablePath;

                    // Connect

                    session.Open(sessionOptions);

                    //Get Ftp File

                    TransferOptions transferOptions = new TransferOptions();

                    transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii

                    transferOptions.FilePermissions = null;  //Permissions applied to remote files;

                                                             //null for default permissions.

                                                             //Can set user, Group, or other Read/Write/Execute permissions.

                    transferOptions.PreserveTimestamp = false;  //Set last write time of destination file

                                                                //to that of source file - basically change the timestamp to match destination and source files.  

                    transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;

 

                    if (session.FileExists(remotePath))

                    {

 

                        // Download the file and throw on any error

                        TransferOperationResult result = session.GetFiles(remotePath, localPath);

 

                        result.Check();

 

                    }

                    else

                    {

                        return false;

                    }

                }

                return true;

            }

            catch (Exception e)

            {

                throw e;

            }

        }

 

        ///

 

        /// Download File from remotePath to localPath using SFTP

        ///

        ///

        ///

        ///

        ///

        public bool DownloadFile(string remotePath, string localPath, bool isCheckFileNewer)

        {

            try

            {

                using (Session session = new Session())

                {

                    // Setup session options

                    SessionOptions sessionOptions = CreateSessionOptions();

                    // set executablePath WinSCP.exe

                    session.ExecutablePath = executablePath;

                    // Connect

                    session.Open(sessionOptions);

                    //Get Ftp File

                    TransferOptions transferOptions = new TransferOptions();

                    transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii

                    transferOptions.FilePermissions = null;  //Permissions applied to remote files;

                                                             //null for default permissions.  

                                                             //Can set user, Group, or other Read/Write/Execute permissions.  

                    transferOptions.PreserveTimestamp = false;  //Set last write time of destination file

                                                                //to that of source file - basically change the timestamp to match destination and source files.  

                    transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;

 

                    if (session.FileExists(remotePath))

                    {

                        bool download = true;

 

                        if (isCheckFileNewer)

                        {

                            //Download if file is updated

                            DateTime remoteWriteTime = session.GetFileInfo(remotePath).LastWriteTime;

                            DateTime localWriteTime = File.GetLastWriteTime(localPath);

 

                            download = remoteWriteTime > localWriteTime;

                        }

 

                        if (download)

                        {

                            // Download the file and throw on any error

                            TransferOperationResult result = session.GetFiles(remotePath, localPath);

 

                            result.Check();

                        }

                    }

                    else

                    {

                        return false;

                    }

                }

                return true;

            }

            catch (Exception e)

            {

                throw e;

            }

        }

        ///

 

        /// Upload File from remotePath to localPath using SFTP

        ///

        ///

        ///

        ///

        ///

        public bool UploadFile(string localPath, string remotePath, bool remove = false)

        {

            bool isSuccess = false;

            try

            {

                // Setup session options

 

                using (Session session = new Session())

                {

                    SessionOptions sessionOptions = CreateSessionOptions();

                    // set executablePath WinSCP.exe

                    session.ExecutablePath = executablePath;

                    // Connect

                    session.Open(sessionOptions);

                    // Putfile

                    TransferOptions transferOptions = new TransferOptions();

                    transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii

                    transferOptions.FilePermissions = null;  //Permissions applied to remote files;

                                                             //null for default permissions.

                                                             //Can set user, Group, or other Read/Write/Execute permissions.

                    transferOptions.PreserveTimestamp = false;  //Set last write time of destination file

                                                                //to that of source file - basically change the timestamp to match destination and source files.  

                    transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;

                    // kiểm tra file local tồn tại                  

                    if (File.Exists(localPath))

                    {

                        // upload file

                        TransferOperationResult transferResult = session.PutFiles(localPath, remotePath, remove, transferOptions);

 

                        //Throw on any error

                        transferResult.Check();

 

                        // TODO log result

                        //Log information and break out if necessary

 

                        isSuccess = transferResult.IsSuccess;

                    }

                    // close connection

                    session.Close();

                }

 

            }

            catch (Exception exception)

            {

                // TODO log

 

                throw exception;

            }

 

            return isSuccess;

        }

        #endregion

    }

 

}