sftp连接操作

     此类为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

    }

猜你喜欢

转载自blog.csdn.net/fangyu723/article/details/109643861