zoukankan      html  css  js  c++  java
  • C#操作FTP, FTPHelper和SFTPHelper

    1. FTPHelper

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Text;
    
    public class FTPHelper
        {
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="fileinfo">需要上传的文件</param>
            /// <param name="targetDir">目标路径</param>
            /// <param name="hostname">ftp地址</param>
            /// <param name="username">ftp用户名</param>
            /// <param name="password">ftp密码</param>
            public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
            {
                //1. check target
                string target;
                if (targetDir.Trim() == "")
                {
                    return;
                }
                string filename = fileinfo.Name;
                if (!string.IsNullOrEmpty(filename))
                    target = filename;
                else
                    target = Guid.NewGuid().ToString();  //使用临时文件名
    
                string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
                ///WebClient webcl = new WebClient();
                System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
    
                //设置FTP命令 设置所要执行的FTP命令,
                //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
                ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
                //指定文件传输的数据类型
                ftp.UseBinary = true;
                ftp.UsePassive = true;
    
                //告诉ftp文件大小
                ftp.ContentLength = fileinfo.Length;
                //缓冲大小设置为2KB
                const int BufferSize = 2048;
                byte[] content = new byte[BufferSize - 1 + 1];
                int dataRead;
    
                //打开一个文件流 (System.IO.FileStream) 去读上传的文件
                using (FileStream fs = fileinfo.OpenRead())
                {
                    try
                    {
                        //把上传的文件写入流
                        using (Stream rs = ftp.GetRequestStream())
                        {
                            do
                            {
                                //每次读文件流的2KB
                                dataRead = fs.Read(content, 0, BufferSize);
                                rs.Write(content, 0, dataRead);
                            } while (!(dataRead < BufferSize));
                            rs.Close();
                        }
    
                    }
                    catch (Exception ex) { }
                    finally
                    {
                        fs.Close();
                    }
    
                }
    
                ftp = null;
            }
    
            /// <summary>
            /// 下载文件
            /// </summary>
            /// <param name="localDir">下载至本地路径</param>
            /// <param name="FtpDir">ftp目标文件路径</param>
            /// <param name="FtpFile">从ftp要下载的文件名</param>
            /// <param name="hostname">ftp地址即IP</param>
            /// <param name="username">ftp用户名</param>
            /// <param name="password">ftp密码</param>
            public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
            {
                string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
                string tmpname = Guid.NewGuid().ToString();
                string localfile = localDir + @"" + tmpname;
    
                System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
                ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
                ftp.UseBinary = true;
                ftp.UsePassive = false;
    
                using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        //loop to read & write to file
                        using (FileStream fs = new FileStream(localfile, FileMode.CreateNew))
                        {
                            try
                            {
                                byte[] buffer = new byte[2048];
                                int read = 0;
                                do
                                {
                                    read = responseStream.Read(buffer, 0, buffer.Length);
                                    fs.Write(buffer, 0, read);
                                } while (!(read == 0));
                                responseStream.Close();
                                fs.Flush();
                                fs.Close();
                            }
                            catch (Exception)
                            {
                                //catch error and delete file only partially downloaded
                                fs.Close();
                                //delete target file as it's incomplete
                                File.Delete(localfile);
                                throw;
                            }
                        }
    
                        responseStream.Close();
                    }
    
                    response.Close();
                }
    
    
    
                try
                {
                    File.Delete(localDir + @"" + FtpFile);
                    File.Move(localfile, localDir + @"" + FtpFile);
    
    
                    ftp = null;
                    ftp = GetRequest(URI, username, password);
                    ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;
                    ftp.GetResponse();
    
                }
                catch (Exception ex)
                {
                    File.Delete(localfile);
                    throw ex;
                }
    
                // 记录日志 "从" + URI.ToString() + "下载到" + localDir + @"" + FtpFile + "成功." );
                ftp = null;
            }
    
    
            /// <summary>
            /// 下载文件
            /// </summary>
            /// <param name="localDir">下载至本地路径</param>
            /// <param name="FtpDir">ftp目标文件路径</param>
            /// <param name="FtpFile">从ftp要下载的文件名</param>
            /// <param name="hostname">ftp地址即IP</param>
            /// <param name="username">ftp用户名</param>
            /// <param name="password">ftp密码</param>
            public static byte[] DownloadFileBytes(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
            {
                byte[] bts;
                string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
                string tmpname = Guid.NewGuid().ToString();
                string localfile = localDir + @"" + tmpname;
    
                System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
                ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
                ftp.UseBinary = true;
                ftp.UsePassive = true;
    
                using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        //loop to read & write to file
                        using (MemoryStream fs = new MemoryStream())
                        {
                            try
                            {
                                byte[] buffer = new byte[2048];
                                int read = 0;
                                do
                                {
                                    read = responseStream.Read(buffer, 0, buffer.Length);
                                    fs.Write(buffer, 0, read);
                                } while (!(read == 0));
                                responseStream.Close();
    
                                //---
                                byte[] mbt = new byte[fs.Length];
                                fs.Read(mbt, 0, mbt.Length);
    
                                bts = mbt;
                                //---
                                fs.Flush();
                                fs.Close();
                            }
                            catch (Exception)
                            {
                                //catch error and delete file only partially downloaded
                                fs.Close();
                                //delete target file as it's incomplete
                                File.Delete(localfile);
                                throw;
                            }
                        }
    
                        responseStream.Close();
                    }
    
                    response.Close();
                }
    
                ftp = null;
                return bts;
            }
    
            /// <summary>
            /// 搜索远程文件
            /// </summary>
            /// <param name="targetDir"></param>
            /// <param name="hostname"></param>
            /// <param name="username"></param>
            /// <param name="password"></param>
            /// <param name="SearchPattern"></param>
            /// <returns></returns>
            public static List<string> ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern)
            {
                List<string> result = new List<string>();
                try
                {
                    string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern;
    
                    System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
                    ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
                    ftp.UsePassive = true;
                    ftp.UseBinary = true;
    
    
                    string str = GetStringResponse(ftp);
                    str = str.Replace("
    ", "
    ").TrimEnd('
    ');
                    str = str.Replace("
    ", "
    ");
                    if (str != string.Empty)
                        result.AddRange(str.Split('
    '));
    
                    return result;
                }
                catch { }
                return null;
            }
    
            private static string GetStringResponse(FtpWebRequest ftp)
            {
                //Get the result, streaming to a string
                string result = "";
                using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
                {
                    long size = response.ContentLength;
                    using (Stream datastream = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
                        {
                            result = sr.ReadToEnd();
                            sr.Close();
                        }
    
                        datastream.Close();
                    }
    
                    response.Close();
                }
    
                return result;
            }
    
            /// 在ftp服务器上创建目录
            /// </summary>
            /// <param name="dirName">创建的目录名称</param>
            /// <param name="ftpHostIP">ftp地址</param>
            /// <param name="username">用户名</param>
            /// <param name="password">密码</param>
            public void MakeDir(string dirName, string ftpHostIP, string username, string password)
            {
                try
                {
                    string uri = "ftp://" + ftpHostIP + "/" + dirName;
                    System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
                    ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
    
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    response.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dirName">创建的目录名称</param>
            /// <param name="ftpHostIP">ftp地址</param>
            /// <param name="username">用户名</param>
            /// <param name="password">密码</param>
            public static void delFile(string dirName, string filename, string ftpHostIP, string username, string password)
            {
                try
                {
                    string uri = "ftp://" + ftpHostIP + "/";
                    if (!string.IsNullOrEmpty(dirName)) {
                        uri += dirName + "/";
                    }
                    uri += filename;
                    System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
                    ftp.Method = WebRequestMethods.Ftp.DeleteFile;
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    response.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            /// <summary>
            /// 删除目录
            /// </summary>
            /// <param name="dirName">创建的目录名称</param>
            /// <param name="ftpHostIP">ftp地址</param>
            /// <param name="username">用户名</param>
            /// <param name="password">密码</param>
            public void delDir(string dirName, string ftpHostIP, string username, string password)
            {
                try
                {
                    string uri = "ftp://" + ftpHostIP + "/" + dirName;
                    System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
                    ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    response.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            /// <summary>
            /// 文件重命名
            /// </summary>
            /// <param name="currentFilename">当前目录名称</param>
            /// <param name="newFilename">重命名目录名称</param>
            /// <param name="ftpServerIP">ftp地址</param>
            /// <param name="username">用户名</param>
            /// <param name="password">密码</param>
            public void Rename(string currentFilename, string newFilename, string ftpServerIP, string username, string password)
            {
                try
                {
    
                    FileInfo fileInf = new FileInfo(currentFilename);
                    string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
                    System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
                    ftp.Method = WebRequestMethods.Ftp.Rename;
    
                    ftp.RenameTo = newFilename;
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
    
                    response.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            private static FtpWebRequest GetRequest(string URI, string username, string password)
            {
                //根据服务器信息FtpWebRequest创建类的对象
                FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
                //提供身份验证信息
                result.Credentials = new System.Net.NetworkCredential(username, password);
                //设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
                result.KeepAlive = false;
                return result;
            }
    
            /*
            /// <summary>
            /// 向Ftp服务器上传文件并创建和本地相同的目录结构
            /// 遍历目录和子目录的文件
            /// </summary>
            /// <param name="file"></param>
            private void GetFileSystemInfos(FileSystemInfo file)
            {
                string getDirecName = file.Name;
                if (!ftpIsExistsFile(getDirecName, "192.168.0.172", "Anonymous", "") && file.Name.Equals(FileName))
                {
                    MakeDir(getDirecName, "192.168.0.172", "Anonymous", "");
                }
                if (!file.Exists) return;
                DirectoryInfo dire = file as DirectoryInfo;
                if (dire == null) return;
                FileSystemInfo[] files = dire.GetFileSystemInfos();
    
                for (int i = 0; i < files.Length; i++)
                {
                    FileInfo fi = files[i] as FileInfo;
                    if (fi != null)
                    {
                        DirectoryInfo DirecObj = fi.Directory;
                        string DireObjName = DirecObj.Name;
                        if (FileName.Equals(DireObjName))
                        {
                            UploadFile(fi, DireObjName, "192.168.0.172", "Anonymous", "");
                        }
                        else
                        {
                            Match m = Regex.Match(files[i].FullName, FileName + "+.*" + DireObjName);
                            //UploadFile(fi, FileName+"/"+DireObjName, "192.168.0.172", "Anonymous", "");
                            UploadFile(fi, m.ToString(), "192.168.0.172", "Anonymous", "");
                        }
                    }
                    else
                    {
                        string[] ArrayStr = files[i].FullName.Split('\');
                        string finame = files[i].Name;
                        Match m = Regex.Match(files[i].FullName, FileName + "+.*" + finame);
                        //MakeDir(ArrayStr[ArrayStr.Length - 2].ToString() + "/" + finame, "192.168.0.172", "Anonymous", "");
                        MakeDir(m.ToString(), "192.168.0.172", "Anonymous", "");
                        GetFileSystemInfos(files[i]);
                    }
                }
            }
             * */
    
            /// <summary>
            /// 判断ftp服务器上该目录是否存在
            /// </summary>
            /// <param name="dirName"></param>
            /// <param name="ftpHostIP"></param>
            /// <param name="username"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            private bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password)
            {
                bool flag = true;
                try
                {
                    string uri = "ftp://" + ftpHostIP + "/" + dirName;
                    System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
                    ftp.Method = WebRequestMethods.Ftp.ListDirectory;
    
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    response.Close();
                }
                catch (Exception)
                {
                    flag = false;
                }
                return flag;
            }
        }

    2. SFTPHelper

    using System;
    using Tamir.SharpSsh.jsch;
    using System.Collections;
    
    
    public class SFTPHelper
    {
        private Session m_session;
        private Channel m_channel;
        private ChannelSftp m_sftp;
    
        //host:sftp地址   user:用户名   pwd:密码        
        public SFTPHelper(string host, string user, string pwd)
        {
            string[] arr = host.Split(':');
            string ip = arr[0];
            int port = 22;
            if (arr.Length > 1) port = Int32.Parse(arr[1]);
    
            JSch jsch = new JSch();
            m_session = jsch.getSession(user, ip, port);
            MyUserInfo ui = new MyUserInfo();
            ui.setPassword(pwd);
            m_session.setUserInfo(ui);
    
        }
    
        //SFTP连接状态        
        public bool Connected { get { return m_session.isConnected(); } }
    
        //连接SFTP        
        public bool Connect()
        {
            try
            {
                if (!Connected)
                {
                    m_session.connect();
                    m_channel = m_session.openChannel("sftp");
                    m_channel.connect();
                    m_sftp = (ChannelSftp)m_channel;
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
    
        //断开SFTP        
        public void Disconnect()
        {
            if (Connected)
            {
                m_channel.disconnect();
                m_session.disconnect();
            }
        }
    
        //SFTP存放文件        
        public bool Put(string localPath, string remotePath)
        {
            try
            {
                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
                m_sftp.put(src, dst);
                return true;
            }
            catch
            {
                return false;
            }
        }
    
        //SFTP获取文件        
        public bool Get(string remotePath, string localPath)
        {
            try
            {
                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
                m_sftp.get(src, dst);
                return true;
            }
            catch
            {
                return false;
            }
        }
        //删除SFTP文件
        public bool Delete(string remoteFile)
        {
            try
            {
                m_sftp.rm(remoteFile);
                return true;
            }
            catch
            {
                return false;
            }
        }
    
        //获取SFTP文件列表        
        public ArrayList GetFileList(string remotePath, string fileType)
        {
            try
            {
                Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
                ArrayList objList = new ArrayList();
                foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
                {
                    string sss = qqq.getFilename();
                    if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
                    { objList.Add(sss); }
                    else { continue; }
                }
    
                return objList;
            }
            catch
            {
                return null;
            }
        }
    
    
        //登录验证信息        
        public class MyUserInfo : UserInfo
        {
            String passwd;
            public String getPassword() { return passwd; }
            public void setPassword(String passwd) { this.passwd = passwd; }
    
            public String getPassphrase() { return null; }
            public bool promptPassphrase(String message) { return true; }
    
            public bool promptPassword(String message) { return true; }
            public bool promptYesNo(String message) { return true; }
            public void showMessage(String message) { }
        }
    
    
    }
    
  • 相关阅读:
    写时复制集合 —— CopyOnWriteArrayList 源码原理阅读笔记
    初步整合vue-element-admin和GitDataV两个Vue开源框架方案实现大数据可视化
    IOS苹果登录sign in with apple后端校验
    IOS审核被拒:IOS苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程
    ios安装自定义基座失败问题
    IOS APP上架App Store及提交审核详细教程
    IOS APP报错:SyntaxError: Invalid regular expression: invalid group specifier name __ERROR
    Apple Pay苹果支付IOS in-App Purchase内购项目服务端校验
    浅析浏览器是如何工作的(一):V8引擎、JIT机制、JS代码解释执行与编译执行
    ApplePay苹果支付内购项目配置及代码实现及沙箱测试
  • 原文地址:https://www.cnblogs.com/TF12138/p/4178252.html
Copyright © 2011-2022 走看看