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中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/and/p/1711695.html
Copyright © 2011-2022 走看看