- การติดตั้ง WinSCP
- การหา Fingerprint
- การ Setup session
- Download Files
- Upload Files
- Create Directory
- List Directory
- Move ไฟล์ทั้งหมดใน srcDirectory ไป desDirectory
nuget WinSCP
Note: SFTP (FTP over SSH) and FTPS (FTP over SSL) (SFTP vs. FTPS: What’s the Best Protocol for Secure FTP?)
1.การติดตั้ง WinSCP
ติดตั้งเวอร์ชันล่าสุด
PM> Install-Package WinSCP
ติดตั้งแบบกำหนดเวอร์ชัน
PM> Install-Package WinSCP -Version 5.15.0
2.การหา Fingerprint
2.1 SFTP
ถ้าใช้ SFTP (FTP over SSH) ให้ connect ด้วย PuTTY จะเห็น Fingerprint

จะเห็น Fingerprint (ตำแหน่งที่ปิดสีดำ)
นำค่าที่ได้มากำหนดให้ SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
ฐาน 16 ต้องเป็นตัวเล็ก (เหมือนกับที่เห็นในรูป) ถ้าเป็นตัวใหญ่จะไม่ได้
2.2 FTPS
ถ้าใช้ FTPS (FTP over SSL) ให้ connect ด้วย WinSCP จะเห็น Fingerprint (เฉพาะกรณีที่ TLS/SSL certificate is not signed by a trusted authority เช่น self signed certificate)

จะเห็น Fingerprint (ตำแหน่งที่ปิดสีดำ)
นำค่าที่ได้มากำหนดให้ TlsHostCertificateFingerprint = "00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:67"
ทำการคลิกที่ copy certificate fingerprint to clipboard (ในกรอบสีเขียว) เพื่อ copy ค่า Fingerprint มาใช้ได้
3. การ Setup session
การหาค่า Setup ด้วย WinSCP
ทำการ connect ด้วย WinSCP ให้เรียบร้อย
เลือกเมนู Session > Generate Session URL/Code
เลือกแท็บ .NET assembly tab

จะเห็นค่าที่ใช้ Setup ครบเลย (รวม Fingerprint)
3.1 SFTP
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
3.2 FTPS
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
FtpSecure = FtpSecure.Explicit,
TlsHostCertificateFingerprint = "00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:67",
};
4.Download Files
using System;
using System.Configuration;
using WinSCP;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//--- Download file from server
string remoteFile = "";
string localFile = "";
if (DownloadSFTP(remoteFile, localFile))
{
Console.WriteLine(string.Format(" Download file '{0}' to local SUCCESS.",remoteFile));
}
//--- Upload file to server
if (UploadSFTP(localFile, remoteFile))
{
Console.WriteLine(string.Format(" Upload file '{0}' to server SUCCESS.", remoteFile));
}
}
private static bool DownloadSFTP(string remoteFile, string localFile)
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
using (WinSCP.Session session = new WinSCP.Session())
{
// Connect
session.Open(sessionOptions);
// Download files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
transferResult = session.GetFiles(remoteFile, localFile, false, transferOptions);
// Throw on any error
transferResult.Check();
// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Console.WriteLine(string.Format("download '{0}' succeeded", transfer.FileName));
}
}
return true;
}
catch (Exception e)
{
Console.WriteLine(string.Format("Error: {0}", e.Message));
return false;
}
}
}
}
5.Upload Files
private static bool UploadSFTP(string localFile, string remoteFile)
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
using (WinSCP.Session session = new WinSCP.Session())
{
// Connect
session.Open(sessionOptions);
// Upload files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
transferResult = session.PutFiles(localFile, remoteFile, false, transferOptions);
// Throw on any error
transferResult.Check();
// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Console.WriteLine(string.Format("Upload '{0}' succeeded", transfer.FileName));
}
}
return true;
}
catch (Exception e)
{
Console.WriteLine(string.Format("Error: {0}", e.Message));
return false;
}
}
6.Create Directory
ก่อนสร้าง directory ตรวจสอบก่อนว่ามี directory นี้แล้วหรือยังด้วย session.FileExists()
public static bool CreateDirectory(string remoteFolder)
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
using (WinSCP.Session session = new WinSCP.Session())
{
// Connect
session.Open(sessionOptions);
if (!session.FileExists(remoteFolder))
{
session.CreateDirectory(remoteFolder);
log.Info(string.Format("CreateDirectory '{0}' succeeded", remoteFolder));
}
else
{
log.Info(string.Format("directory '{0}' already exist", remoteFolder));
}
}
return true;
}
catch (Exception e)
{
Program.log.Info(string.Format("Error: {0}", e.Message));
return false;
}
}
7.List Directory
ดูรายชื่อไฟล์ใน Directory
public static bool ListDirectory(string remoteFolder)
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
RemoteDirectoryInfo directory =
session.ListDirectory(remoteFolder);
foreach (RemoteFileInfo fileInfo in directory.Files)
{
//log.Info(string.Format(
// "{0} with size {1}, permissions {2} and last modification at {3}",
// fileInfo.Name, fileInfo.Length, fileInfo.FilePermissions,
// fileInfo.LastWriteTime));
if ((fileInfo.Name != ".") && (fileInfo.Name != ".."))
{
log.Info(string.Format("'{0}'", fileInfo.Name));
}
}
}
return true;
}
catch (Exception e)
{
log.Info(string.Format("Error: {0}", e.Message));
return false;
}
}
8.Move ไฟล์ทั้งหมดใน srcDirectory ไป desDirectory
public static bool DoMoveFile(string sourceFolder, string desFolder)
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings.Get("FTPServer"),
UserName = ConfigurationManager.AppSettings.Get("FTPUserName"),
Password = ConfigurationManager.AppSettings.Get("FTPPassword"),
SshHostKeyFingerprint = "ssh-ed25519 256 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
RemoteDirectoryInfo directory =
session.ListDirectory(sourceFolder);
foreach (RemoteFileInfo fileInfo in directory.Files)
{
if ((fileInfo.Name != ".") && (fileInfo.Name != ".."))
{
string sourceFile = string.Format("{0}/{1}", sourceFolder, fileInfo.Name);
//string sourceFile = fileInfo.Name;
string desFile = string.Format("{0}/{1}", desFolder, fileInfo.Name);
log.Info(string.Format("Move '{0}' to '{1}'", sourceFile, desFile));
session.MoveFile(sourceFile, desFile);
}
}
}
return true;
}
catch (Exception e)
{
log.Info(string.Format("Error: {0}", e.Message));
return false;
}
}
Link