zoukankan      html  css  js  c++  java
  • C#实现FTP文件上传下载移动

    前些天应需求,写了一个自动读取ftp文件的功能,并在读取完成后将文件移动到指定文件夹,下面将代码贴出来。
    以下我都是写在一个Ftp帮助类中

    private static string FTPCONSTR = "";//FTP的服务器地址
    private static string FTPUSERNAME = "";//FTP服务器的用户名
    private static string FTPPASSWORD = "";//FTP服务器的密码
    private static FtpWebRequest objReqFtp = null; //FTP連接
    

    将需要用到的变量写在这,当然也可以动态获取,看需求。

    #region FTP連接
    /// <summary>
    /// 连接ftp方法
    /// </summary>
    /// <param name="path"></param>
    private static void Connect(String path)
    {
        // 根据uri创建FtpWebRequest对象
        objReqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
        // 指定数据传输类型
        //To transmit text data, change the UseBinary property from its default value ( true) to false.
        objReqFtp.UseBinary = true;
        // specifies that an SSL connection
        objReqFtp.EnableSsl = false;
        // ftp用户名和密码
        objReqFtp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD);
    }
    #endregion
    
    #region 獲取編碼方式
    /// <summary>
    /// 获取编码方式
    /// </summary>
    /// <param name="response"></param>
    /// <returns></returns>
    private static Encoding GetEncodingEncode(WebResponse response)
    {
        Encoding encodingTemp = Encoding.Default;
        StreamReader reader = new StreamReader(response.GetResponseStream());
        encodingTemp = reader.CurrentEncoding;
    
        if (encodingTemp == Encoding.UTF8)
        {
            encodingTemp = Encoding.UTF8;
        }
        else if (encodingTemp == Encoding.Default)
        {
            encodingTemp = Encoding.GetEncoding("GB2312");
        }
        else
        {
            encodingTemp = Encoding.UTF8;
        }
        return encodingTemp;
    }
    #endregion
    
    #region 获取FTP目录下所有文件名
    /// <summary>
    /// 读取文件目录下所有的文件名称,包括文件夹名称
    /// </summary>
    /// <param name="ftpAdd">传过来的文件夹路径</param>
    /// <returns>返回的文件或文件夹名称</returns>
    public static string[] GetFtpFileList(string FTPURL)
    {
        string url = FTPCONSTR + FTPURL;
    
        Connect(url);
    
        if (objReqFtp != null)
        {
            StringBuilder fileListBuilder = new StringBuilder();
            //ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;//该方法可以得到文件名称的详细资源,包括修改时间、类型等这些属性
            objReqFtp.Method = WebRequestMethods.Ftp.ListDirectory;//只得到文件或文件夹的名称
            try
            {
                WebResponse ftpResponse = objReqFtp.GetResponse();
                Encoding encod = GetEncodingEncode(ftpResponse);//獲取編碼
                StreamReader ftpFileListReader = new StreamReader(ftpResponse.GetResponseStream(), encod);
    
                string line = ftpFileListReader.ReadLine();
                while (line != null)
                {
                    fileListBuilder.Append(line);
                    fileListBuilder.Append("@");//每个文件名称之间用@符号隔开,便于前端调用的时候解析
                    line = ftpFileListReader.ReadLine();
                }
                ftpFileListReader.Close();
                ftpResponse.Close();
                fileListBuilder.Remove(fileListBuilder.ToString().LastIndexOf("@"), 1);
                return fileListBuilder.ToString().Split('@');//返回得到的数组
            }
            catch (Exception ex)
            {
                Mail.SendmailToMIS($"获取FTP文件列表異常{ex.Message}", "SO3");
                return null;
            }
        }
        else
        {
            return null;
        }
    }
    #endregion
    
    #region 文件自动上传
     public static bool UploadFile(string ftpPath, string path, string id)
    {
        FileInfo f = new FileInfo(path);
        path = path.Replace("\", "/");
        bool b = MakeDir(ftpPath);
        if (b == false)
        {
            return false;
        }
        path = FTPCONSTR + ftpPath + id;
        Connect(path);
        objReqFtp.KeepAlive = false;
        objReqFtp.Method = WebRequestMethods.Ftp.UploadFile;
        objReqFtp.ContentLength = f.Length;
        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;
        FileStream fs = f.OpenRead();
        try
        {
            Stream strm = objReqFtp.GetRequestStream();
            contentLen = fs.Read(buff, 0, buffLength);
            while (contentLen != 0)
            {
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }
            strm.Close();
            fs.Close();
            return true;
        }
        catch (Exception ex)
        {
            Mail.SendmailToMIS($"因{ex.Message},无法完成上传", "SO3");
            return false;
        }
    }
    #endregion
    
    #region 从ftp服务器下载文件
    /// <summary>
    /// 从ftp服务器下载文件的功能
    /// </summary>
    /// <param name="ftpfilepath">ftp下载的地址</param>
    /// <param name="filePath">存放到本地的路径</param>
    /// <param name="fileName">保存的文件名称</param>
    /// <returns></returns>
    public static bool Download(string ftpfilepath, string filePath, string fileName)
    {
        try
        {     
            String onlyFileName = Path.GetFileName(fileName);
            string newFileName = filePath + onlyFileName;
            if (File.Exists(newFileName))
            {
                File.Delete(newFileName);//若存在,先刪除
            }
            ftpfilepath = ftpfilepath.Replace("\", "/");
            string url = FTPCONSTR + ftpfilepath;
    
            Connect(url);
    
            FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            FileStream outputStream = new FileStream(newFileName, FileMode.Create);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }
            ftpStream.Close();
            outputStream.Close();
            response.Close();
            return true;
        }
        catch (Exception ex)
        {
            Mail.SendmailToMIS($"FTP下载异常{ex.Message}", "SO3");
            return false;
        }
    }
    #endregion
    
    #region 文件移动
    /// <summary>
    /// 包括ftp服务器内移动or重命名,目标目录若已有同名文件,原文件会被删除
    /// </summary>
    /// <param name="currentFilename">当前目录</param> 
    /// <param name="newFilename">新目录</param>********
    public static bool RenameAndMove(string currentFilename, string newFilename)
    {
        try
        {
            //currentFilename = currentFilename.Replace("\", "/"); //*******完整的文件路徑,包括Ftp服务器地址和文件名和后缀******                      
            string uri = FTPCONSTR + currentFilename;
            Connect(uri);
    
            objReqFtp.Method = WebRequestMethods.Ftp.Rename;
            objReqFtp.RenameTo = newFilename;//********************新的路径,不需要ftp服务器地址
            objReqFtp.UseBinary = true;
            FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse();
            Stream ftpStream = response.GetResponseStream();
    
            if (ftpStream != null)
            {
                ftpStream.Close();
            }
            bool success = response.StatusCode == FtpStatusCode.CommandOK || response.StatusCode == FtpStatusCode.FileActionOK;
            response.Close();
            objReqFtp = null;
            return success;
        }
        catch (Exception ex)
        {
            Mail.SendmailToMIS($"文件移動時產生異常{ex.Message}", "SO3");
            return false;
        }
    }
    #endregion
    
    #region 从ftp服务器删除文件的功能
    /// <summary>
    /// 从ftp服务器删除文件的功能
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static bool DeleteFile(string fileName)
    {
        try
        {
            string url = FTPCONSTR + fileName;
            Connect(url);
            objReqFtp.Method = WebRequestMethods.Ftp.DeleteFile;
            
            FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse();
            response.Close();
            return true;
        }
        catch (Exception ex)
        {
            Mail.SendmailToMIS($"文件刪除時產生異常{ex.Message}", "SO3");
            return false;
        }
    }
    #endregion
    

    调用时直接给对应的参数就ok。

  • 相关阅读:
    实现手机页面转换
    Activity到另一个Acivity
    Android简单的Button事件处理
    样式定义Android界面样式
    更改手机窗口画面底色——color.xml定义颜色
    搭建每日构建环境
    perl常用语法
    perl开发文档
    IT项目实施规范
    快速开发php扩展
  • 原文地址:https://www.cnblogs.com/bemad/p/13218742.html
Copyright © 2011-2022 走看看