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) { }
        }
    
    
    }
    
  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/TF12138/p/4178252.html
Copyright © 2011-2022 走看看