zoukankan      html  css  js  c++  java
  • FTP操作

    在面向对象编程的世界里,实现一个功能的步骤一般可以如下:

      一、创建对象

     二、设置属性

     三、调用方法   

    在实现FTP的功能中要用到的命名空间

    using System.Net;
    using System.IO;

    重要的类

    FileInfo、Uri、FtpWebRequest、NetworkCredential、WebRequestMethods、FileStream、Stream

    下面的几个步骤包括了使用FtpWebRequest类实现ftp功能的一般过程
    1、创建一个FtpWebRequest对象,指向ftp服务器的uri
    2、设置ftp的执行方法(上传,下载等)
    3、给FtpWebRequest对象设置属性(是否支持ssl,是否使用二进制传输等)
    4、设置登录验证(用户名,密码)
    5、执行请求
    6、接收相应流(如果需要的话)
    7、如果没有打开的流,则关闭ftp请求

      

    其中一些重要的属性如下:
        ·Credentials - 指定登录ftp服务器的用户名和密码。
        ·KeepAlive - 指定连接是应该关闭还是在请求完成之后关闭,默认为true
        ·UseBinary - 指定文件传输的类型。有两种文件传输模式,一种是Binary,另一种是ASCII。如果能用记事本读和写的文件用ASCII传输就是安全的,

         而其他的则必须使用Binary模式。当然使用Binary模式发送ASCII文件也是非常好的。
        ·UsePassive - 指定使用主动模式还是被动模式。(建议被动模式)

        ·ContentLength - 设置这个属性对于ftp服务器是有用的,但是客户端不使用它,因为FtpWebRequest忽略这个属性,所以在这种情况下,该属性是无效的。但是如果我们设置了这个属性,ftp服务器将会提前预知文件的大小(在upload时会有这种情况)
        ·Method - 指定当前请求是什么命令(upload,download,filelist等)。这个值定义在结构体WebRequestMethods.Ftp中。

    为了更进一部简化操作就封装了一个简单的FTP操作类

    class FTP_Class
    {
    string ftpServerIP;
    string ftpUserID;
    string ftpPassword;
    FtpWebRequest reqFTP;
    #region 连接
    ///
    <summary>
    /// 连接FtpWebRequest
    ///
    </summary>
    ///
    <param name="path"></param>
    private void Connect(String path)//连接ftp
    {
    // 根据uri创建FtpWebRequest对象
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
    // 指定数据传输类型
    reqFTP.UseBinary = true;
    // ftp用户名和密码
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    }
    #endregion

    #region ftp登录信息
    ///
    <summary>
    /// ftp登录信息
    ///
    </summary>
    ///
    <param name="ftpServerIP">FtpIP地址</param>
    ///
    <param name="ftpUserID">ftp用户名</param>
    ///
    <param name="ftpPassword">ftp密码</param>
    public void FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword)
    {
    this.ftpServerIP = ftpServerIP;
    this.ftpUserID = ftpUserID;
    this.ftpPassword = ftpPassword;
    }
    #endregion

    #region 获取文件列表
    ///
    <summary>
    /// 上面的代码示例了如何从ftp服务器上获得文件列表
    ///
    </summary>
    ///
    <param name="path">URL路径</param>
    ///
    <param name="WRMethods"></param>
    ///
    <returns>String[] </returns>
    private string[] GetFileList(string path, string WRMethods) //内部方法
    {
    string[] downloadFiles;
    StringBuilder result = new StringBuilder();
    try
    {
    Connect(path);
    reqFTP.Method = WRMethods;
    WebResponse response = reqFTP.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);//中文文件名
    string line = reader.ReadLine();
    while (line != null)
    {
    result.Append(line);
    result.Append("\n");
    line = reader.ReadLine(); //读取下一行
    }
    result.Remove(result.ToString().LastIndexOf('\n'), 1);
    reader.Close();
    response.Close();
    return result.ToString().Split('\n');
    }
    catch (Exception ex)
    {

    Console.WriteLine(ex.Message);
    downloadFiles = null;
    return downloadFiles;
    }
    }
    ///
    <summary>
    ///根据知道的文件路径得到文件列表
    ///
    </summary>
    ///
    <param name="path"></param>
    ///
    <returns></returns>
    public string[] GetFileList(string path)
    {
    return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory);
    }
    ///
    <summary>
    /// 默认URl文件列表
    ///
    </summary>
    ///
    <returns></returns>
    public string[] GetFileList()
    {
    return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);
    }
    #endregion

    #region 上传文件
    ///
    <summary>
    ///从ftp服务器上载文件的功能
    ///
    </summary>
    ///
    <param name="filename">要上传的文件</param>
    ///
    <param name="path">上传的路径</param>
    ///
    <param name="errorinfo">返回信息</param>
    ///
    <returns></returns>
    public bool Upload(string filename, string path, out string errorinfo)
    {
    path = path.Replace("\\", "/");
    FileInfo fileInf = new FileInfo(filename);
    string uri = "ftp://" + path + "/" + fileInf.Name;
    Connect(uri);//连接
    // 默认为true,连接不会被关闭
    // 在一个命令之后被执行
    reqFTP.KeepAlive = false;
    // 指定执行什么命令
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    // 上传文件时通知服务器文件的大小
    reqFTP.ContentLength = fileInf.Length;
    // 缓冲大小设置为kb
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
    int contentLen;
    // 打开一个文件流(System.IO.FileStream) 去读上传的文件
    FileStream fs = fileInf.OpenRead();
    try
    {
    // 把上传的文件写入流
    Stream strm = reqFTP.GetRequestStream();
    // 每次读文件流的kb
    contentLen = fs.Read(buff, 0, buffLength);
    // 流内容没有结束
    while (contentLen != 0)
    {
    // 把内容从file stream 写入upload stream
    strm.Write(buff, 0, contentLen);
    contentLen = fs.Read(buff, 0, buffLength);
    }
    // 关闭两个流
    strm.Close();
    fs.Close();
    errorinfo = "完成";
    return true;
    }
    catch (Exception ex)
    {
    errorinfo = string.Format("因{0},无法完成上传", ex.Message);
    return false;
    }
    }
    #endregion

    #region 续传文件
    ///
    <summary>
    /// 续传文件
    ///
    </summary>
    ///
    <param name="filename">文件名</param>
    ///
    <param name="size">文件的大小</param>
    ///
    <param name="path">路径</param>
    ///
    <param name="errorinfo">返回信息</param>
    ///
    <returns></returns>
    public bool Upload(string filename, long size, string path, out string errorinfo)
    {
    path = path.Replace("\\", "/");
    FileInfo fileInf = new FileInfo(filename);
    //string uri = "ftp://" + path + "/" + fileInf.Name;
    string uri = "ftp://" + path;
    Connect(uri);//连接
    // 默认为true,连接不会被关闭
    // 在一个命令之后被执行
    reqFTP.KeepAlive = false;
    // 指定执行什么命令
    reqFTP.Method = WebRequestMethods.Ftp.AppendFile;
    // 上传文件时通知服务器文件的大小
    reqFTP.ContentLength = fileInf.Length;
    // 缓冲大小设置为kb
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
    int contentLen;
    // 打开一个文件流(System.IO.FileStream) 去读上传的文件
    FileStream fs = fileInf.OpenRead();
    try
    {
    StreamReader dsad = new StreamReader(fs);
    fs.Seek(size, SeekOrigin.Begin);
    // 把上传的文件写入流
    Stream strm = reqFTP.GetRequestStream();
    // 每次读文件流的kb
    contentLen = fs.Read(buff, 0, buffLength);
    // 流内容没有结束
    while (contentLen != 0)
    {
    // 把内容从file stream 写入upload stream
    strm.Write(buff, 0, contentLen);
    contentLen = fs.Read(buff, 0, buffLength);
    }
    // 关闭两个流
    strm.Close();
    fs.Close();
    errorinfo = "完成";
    return true;
    }
    catch (Exception ex)
    {
    errorinfo = string.Format("因{0},无法完成上传", ex.Message);
    return false;
    }
    }
    #endregion

    #region 下载文件
    ///
    <summary>
    /// 上面的代码实现了从ftp服务器下载文件的功能
    ///
    </summary>
    ///
    <param name="filePath">文件</param>
    ///
    <param name="fileName"></param>
    ///
    <param name="errorinfo"></param>
    ///
    <returns></returns>
    public bool Download(string ftpfilepath, string filePath, string fileName, out string errorinfo)
    {
    try
    {
    filePath = filePath.Replace("我的电脑\\", "");
    String onlyFileName = Path.GetFileName(fileName);
    string newFileName = filePath + onlyFileName;
    if (File.Exists(newFileName))
    {
    errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName);
    return false;
    }
    ftpfilepath = ftpfilepath.Replace("\\", "/");
    string url = "ftp://" + ftpfilepath;
    Connect(url);//连接
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    FtpWebResponse response = (FtpWebResponse)reqFTP.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();
    errorinfo = "";
    return true;
    }
    catch (Exception ex)
    {
    errorinfo = string.Format("因{0},无法下载", ex.Message);
    return false;
    }
    }
    #endregion

    #region 删除文件
    ///
    <summary>
    /// 删除文件
    ///
    </summary>
    ///
    <param name="fileName"></param>
    public void DeleteFileName(string fileName)
    {
    try
    {
    FileInfo fileInf = new FileInfo(fileName);
    string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
    Connect(uri);//连接
    // 默认为true,连接不会被关闭
    // 在一个命令之后被执行
    reqFTP.KeepAlive = false;
    // 指定执行什么命令
    reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    response.Close();
    }
    catch (Exception ex)
    {
    //MessageBox.Show(ex.Message, "删除错误");
    }
    }
    #endregion

    #region 在ftp上创建目录
    ///
    <summary>
    /// 在ftp上创建目录
    ///
    </summary>
    ///
    <param name="dirName"></param>
    public void MakeDir(string dirName)
    {
    try
    {
    string uri = "ftp://" + ftpServerIP + "/" + dirName;
    Connect(uri);//连接
    reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

    response.Close();
    }
    catch (Exception ex)
    {
    // MessageBox.Show(ex.Message);
    }
    }
    #endregion

    #region 删除ftp上目录
    ///
    <summary>
    /// 删除ftp上目录
    ///
    </summary>
    ///
    <param name="dirName"></param>
    public void delDir(string dirName)
    {
    try
    {
    string uri = "ftp://" + ftpServerIP + "/" + dirName;
    Connect(uri);//连接
    reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    response.Close();
    }
    catch (Exception ex)
    {
    // MessageBox.Show(ex.Message);
    }
    }
    #endregion

    #region 获得ftp上文件大小
    ///
    <summary>
    /// 获得ftp上文件大小
    ///
    </summary>
    ///
    <param name="filename"></param>
    ///
    <returns></returns>
    public long GetFileSize(string filename)
    {
    long fileSize = 0;
    filename = filename.Replace("\\", "/");
    try
    {
    // FileInfo fileInf = new FileInfo(filename);
    //string uri1 = "ftp://" + ftpServerIP + "/" + fileInf.Name;
    // string uri = filename;
    string uri = "ftp://" + filename;
    Connect(uri);//连接
    reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    fileSize = response.ContentLength;
    response.Close();
    }
    catch (Exception ex)
    {
    // MessageBox.Show(ex.Message);
    }
    return fileSize;
    }
    #endregion

    #region ftp上文件改名
    ///
    <summary>
    /// ftp上文件改名
    ///
    </summary>
    ///
    <param name="currentFilename"></param>
    ///
    <param name="newFilename"></param>
    public void Rename(string currentFilename, string newFilename)
    {
    try
    {
    FileInfo fileInf = new FileInfo(currentFilename);
    string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
    Connect(uri);//连接
    reqFTP.Method = WebRequestMethods.Ftp.Rename;
    reqFTP.RenameTo = newFilename;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    //Stream ftpStream = response.GetResponseStream();
    //ftpStream.Close();
    response.Close();
    }
    catch (Exception ex)
    {
    // MessageBox.Show(ex.Message);
    }
    }
    #endregion

    #region 获得文件明晰
    ///
    <summary>
    /// 获得文件明晰
    ///
    </summary>
    ///
    <returns></returns>
    public string[] GetFilesDetailList()
    {
    return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails);
    }
    ///
    <summary>
    /// 获得文件明晰
    ///
    </summary>
    ///
    <param name="path"></param>
    ///
    <returns></returns>
    public string[] GetFilesDetailList(string path)
    {
    path = path.Replace("\\", "/");
    return GetFileList("ftp://" + path, WebRequestMethods.Ftp.ListDirectoryDetails);
    }
    #endregion

    }
  • 相关阅读:
    java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点
    java学习笔记 (1) —— Strut2.3.24环境搭建
    数据不平衡问题的处理
    正则化与特征稀疏,过拟合
    leetcode144-先序遍历非递归实现
    解释器资料
    ROC,AUC
    假设检验——KS检验
    SVM理解
    高斯过程与核密度估计
  • 原文地址:https://www.cnblogs.com/and/p/1711695.html
Copyright © 2011-2022 走看看