此类为sftp连接操作类
使用方法:引用SshNet文件夹下的Renci.SshNet.dll文件,以及此类文件,即可使用
使用:
//构造ftp连接
SFTPOperation sf = new SFTPOperation(FtpUrl, "22", ftpuserid, ftppassword);
if (sf.Connect())//连接ftp
{
string strResultPath = "/data/FtpServer/" + strZqCode + "/" + strTimp;
sf.CreateDirectory(strResultPath);//创建文件夹
string localPath="";
string remotePath="";
sf.Put(localPath,remotePath);//上传
string strError = "";
sf.DownloadFile(localFile, file, out strError);//下载
string remotePath = "/data/FtpServer/LDGXCG-1604653823591";
var files = sf.GetFileList(remotePath, "").ToArray();//获取文件
sf.Disconnect();
}
public class SFTPOperation
{
#region 字段或属性
private SftpClient sftp;
/// <summary>
/// SFTP连接状态
/// </summary>
public bool Connected { get { return sftp.IsConnected; } }
#endregion
/// <summary>
/// 构造
/// </summary>
/// <param name="ip">IP</param>
/// <param name="port">端口</param>
/// <param name="user">用户名</param>
/// <param name="pwd">密码</param>
public SFTPOperation(string ip, string port, string user, string pwd)
{
sftp = new SftpClient(ip, Int32.Parse(port), user, pwd);
}
#region 连接SFTP
/// <summary>
/// 连接SFTP
/// </summary>
/// <returns>true成功</returns>
public bool Connect()
{
try
{
if (!Connected)
{
sftp.Connect();
}
return true;
}
catch (Exception ex)
{
throw new Exception(string.Format("连接SFTP失败,原因:{0}", ex.Message));
}
}
#endregion
#region 断开SFTP
/// <summary>
/// 断开SFTP
/// </summary>
public void Disconnect()
{
try
{
if (sftp != null && Connected)
{
sftp.Disconnect();
}
}
catch (Exception ex)
{
throw new Exception(string.Format("断开SFTP失败,原因:{0}", ex.Message));
}
}
#endregion
#region SFTP上传文件
/// <summary>
/// SFTP上传文件
/// </summary>
/// <param name="localPath">本地路径</param>
/// <param name="remotePath">远程路径</param>
public void Put(string localPath, string remotePath)
{
try
{
using (var file = File.OpenRead(localPath))
{
sftp.UploadFile(file, remotePath);
}
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
}
}
/// <summary>
/// SFTP上传文件
/// </summary>
/// <param name="stream">本地文件路径</param>
/// <param name="remotePath">远程路径</param>
public bool Put(string laocPath, string remotePath, out string strError)
{
strError = string.Empty;
try
{
Stream stream = File.OpenRead(laocPath);
sftp.UploadFile(stream, remotePath);
return true;
}
catch (Exception ex)
{
strError = ex.Message;
//throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
return false;
}
}
#endregion
#region SFTP下载文件
/// <summary>
/// SFTP下载文件
/// </summary>
/// <param name="stream">本地文件路径</param>
/// <param name="remotePath">远程路径</param>
public bool DownloadFile(string laocPath, string remotePath, out string strError)
{
strError = string.Empty;
try
{
if (sftp.Exists(remotePath))
{
using (var stream = File.Open(laocPath, FileMode.OpenOrCreate))
{
sftp.DownloadFile(remotePath, stream);
}
return true;
}
else
{
strError = "远程文件不存";
return false;
}
}
catch (Exception ex)
{
strError = ex.Message;
//throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
return false;
}
}
#endregion
#region SFTP获取文件
/// <summary>
/// SFTP获取文件
/// </summary>
/// <param name="remotePath">远程路径</param>
/// <param name="localPath">本地路径</param>
public void Get(string remotePath, string localPath)
{
try
{
var byt = sftp.ReadAllBytes(remotePath);
File.WriteAllBytes(localPath, byt);
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件获取失败,原因:{0}", ex.Message));
}
}
//public void DownloadFile()
//{
// //sftp.DownloadFile()
//}
#endregion
#region 删除SFTP文件
/// <summary>
/// 删除SFTP文件
/// </summary>
/// <param name="remotePath">远程路径</param>
public void Delete(string remotePath)
{
try
{
sftp.Delete(remotePath);
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
}
}
/// <summary>
/// 删除SFTP文件
/// </summary>
/// <param name="remoteFile">远程路径</param>
public void DeleteFile(string remoteFile)
{
try
{
sftp.DeleteFile(remoteFile);
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
}
}
#endregion
#region 获取SFTP文件列表
/// <summary>
/// 获取SFTP文件列表
/// </summary>
/// <param name="remotePath">远程目录</param>
/// <param name="fileSuffix">文件后缀</param>
/// <returns></returns>
public ArrayList GetFileList(string remotePath, string fileSuffix)
{
try
{
fileSuffix = fileSuffix.ToUpper();
var files = sftp.ListDirectory(remotePath);
var objList = new ArrayList();
foreach (var file in files)
{
if (file.IsDirectory) continue;
string name = file.Name.ToUpper();
if (name.Length > (fileSuffix.Length + 1) && fileSuffix == name.Substring(name.Length - fileSuffix.Length))
{
objList.Add(file.FullName);
}
}
return objList;
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件列表获取失败,原因:{0}", ex.Message));
}
}
#endregion
#region 移动SFTP文件
/// <summary>
/// 移动SFTP文件
/// </summary>
/// <param name="oldRemotePath">旧远程路径</param>
/// <param name="newRemotePath">新远程路径</param>
public void Move(string oldRemotePath, string newRemotePath)
{
string fileName = string.Empty;
try
{
newRemotePath = !sftp.WorkingDirectory.Equals("/") ? sftp.WorkingDirectory + newRemotePath : newRemotePath;
CreateDirectory(newRemotePath);
fileName = oldRemotePath.LastIndexOf('/') != -1 ? oldRemotePath.Substring(oldRemotePath.LastIndexOf('/') + 1) : oldRemotePath;
SftpFile file = sftp.ListDirectory(newRemotePath).SingleOrDefault(l => l.Name == fileName);
if (file != null)
fileName = fileName.Substring(0, fileName.LastIndexOf(".")) + DateTime.Now.ToString("_yyyyMMddHHmmss") + "." + fileName.Substring(fileName.LastIndexOf(".") + 1);
sftp.RenameFile(oldRemotePath, newRemotePath + "/" + fileName);
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件移动失败,原因:{0}", ex.Message));
}
}
#endregion
#region 创建目录
/// <summary>
/// 创建目录
/// </summary>
/// <param name="remotePath">远程目录</param>
public void CreateDirectory(string remotePath)
{
try
{
string[] paths = remotePath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
string curPath = "/";
for (int i = 0; i < paths.Length; i++)
{
curPath += paths[i];
if (!sftp.Exists(curPath))
{
sftp.CreateDirectory(curPath);
}
if (i < paths.Length - 1)
curPath += "/";
}
}
catch (Exception ex)
{
if (sftp.IsConnected)
Disconnect();
throw new Exception(string.Format("创建目录失败,原因:{0}", ex.Message));
}
}
#endregion
#region 获取目录列表
/// <summary>
/// 获取目录列表
/// </summary>
/// <param name="remotePath">远程目录路径</param>
/// <returns></returns>
public ArrayList GetDirectoryList(string remotePath)
{
try
{
var files = sftp.ListDirectory(remotePath);
var objList = new ArrayList();
foreach (var file in files)
{
if (!file.IsDirectory) continue;
if (!file.Name.Equals(".") && !file.Name.Equals(".."))
objList.Add(file.FullName);
}
return objList;
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP目录列表获取失败,原因:{0}", ex.Message));
}
}
#endregion
#region 删除远程目录
/// <summary>
/// 删除远程目录(包含目录内文件、子目录)
/// </summary>
/// <param name="remoteDirectory">远程目录</param>
public void DeleteDirectory(string remoteDirectory)
{
try
{
//delete files
var files = sftp.ListDirectory(remoteDirectory);
foreach (var file in files)
{
if (!file.IsDirectory)
sftp.DeleteFile(file.FullName);
else
{
if (!file.Name.Equals(".") && !file.Name.Equals(".."))
{
DeleteDirectory(file.FullName);
}
}
}
sftp.DeleteDirectory(remoteDirectory);
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP目录删除失败,原因:{0}", ex.Message));
}
}
#endregion
#region 获取SFTP数据表格
/// <summary>
/// 获取SFTP数据表格
/// </summary>
/// <param name="remotePath">远程路径</param>
/// <returns>DataTable</returns>
public DataTable GetDataTable(string remotePath)
{
StreamReader sr = null;
try
{
DataTable dt = new DataTable();
sr = sftp.OpenText(remotePath);
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
aryLine = strLine.Trim().Split('\t'); //把读取到的内容分割
if (IsFirst == true)
{
IsFirst = false;
columnCount = aryLine.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
if (!dt.Columns.Contains(aryLine[i]))
{
DataColumn dc = new DataColumn(aryLine[i]);
dt.Columns.Add(dc);
}
else
columnCount--;
}
}
else
{
DataRow dr = dt.NewRow(); //创建行
for (int j = 0; j < dt.Columns.Count; j++)
{
dr[j] = aryLine.Length > j ? aryLine[j] : "";
}
dt.Rows.Add(dr);
}
}
return dt;
}
catch (Exception ex)
{
throw new Exception(string.Format("SFTP文件转换失败,原因:{0}", ex.Message));
}
finally
{
sr.Dispose();
sr.Close();
}
}
#endregion
}