• C# FTP操作类


    using System;
    using System.Net;
    using System.IO;
    using System.Text;
    using System.Net.Sockets;
    using System.Collections.Generic;

    namespace 阿飞_秋风扫落叶网站软文系统.Common
    {


    public class FTPHelper
    {
    /// <summary>
    /// FTP请求对象
    /// </summary>
    FtpWebRequest request = null;
    /// <summary>
    /// FTP响应对象
    /// </summary>
    FtpWebResponse response = null;
    /// <summary>
    /// FTP服务器地址
    /// </summary>
    public string ftpURI { get; private set; }
    /// <summary>
    /// FTP服务器IP
    /// </summary>
    public string ftpServerIP { get; private set; }
    /// <summary>
    /// FTP服务器默认目录
    /// </summary>
    public string ftpRemotePath { get; private set; }
    /// <summary>
    /// FTP服务器登录用户名
    /// </summary>
    public string ftpUserID { get; private set; }
    /// <summary>
    /// FTP服务器登录密码
    /// </summary>
    public string ftpPassword { get; private set; }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="FtpServerIP">FTP连接地址</param>
    /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
    /// <param name="FtpUserID">用户名</param>
    /// <param name="FtpPassword">密码</param>
    public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, string ftpPassword)
    {
    this.ftpServerIP = ftpServerIP;
    this.ftpRemotePath = ftpRemotePath;
    this.ftpUserID = ftpUserID;
    this.ftpPassword = ftpPassword;
    this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
    }
    ~FTPHelper()
    {
    if (response != null)
    {
    response.Close();
    response = null;
    }
    if (request != null)
    {
    request.Abort();
    request = null;
    }
    }
    /// <summary>
    /// 建立FTP链接,返回响应对象
    /// </summary>
    /// <param name="uri">FTP地址</param>
    /// <param name="ftpMethod">操作命令</param>
    /// <returns></returns>
    private FtpWebResponse Open(Uri uri, string ftpMethod)
    {
    request = (FtpWebRequest)FtpWebRequest.Create(uri);
    request.Method = ftpMethod;
    request.UseBinary = true;
    request.KeepAlive = false;
    request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
    return (FtpWebResponse)request.GetResponse();
    }

    /// <summary>
    /// 建立FTP链接,返回请求对象
    /// </summary>
    /// <param name="uri">FTP地址</param>
    /// <param name="ftpMethod">操作命令</param>
    private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)
    {
    request = (FtpWebRequest)WebRequest.Create(uri);
    request.Method = ftpMethod;
    request.UseBinary = true;
    request.KeepAlive = false;
    request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
    return request;
    }
    /// <summary>
    /// 创建目录
    /// </summary>
    /// <param name="remoteDirectoryName">目录名</param>
    public void CreateDirectory(string remoteDirectoryName)
    {
    response = Open(new Uri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
    }
    /// <summary>
    /// 更改目录或文件名
    /// </summary>
    /// <param name="currentName">当前名称</param>
    /// <param name="newName">修改后新名称</param>
    public void ReName(string currentName, string newName)
    {
    request = OpenRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);
    request.RenameTo = newName;
    response = (FtpWebResponse)request.GetResponse();
    }
    /// <summary>
    /// 切换当前目录
    /// </summary>
    /// <param name="IsRoot">true:绝对路径 false:相对路径</param>
    public void GotoDirectory(string DirectoryName, bool IsRoot)
    {
    if (IsRoot)
    ftpRemotePath = DirectoryName;
    else
    ftpRemotePath += "/" + DirectoryName;

    ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
    }
    /// <summary>
    /// 删除目录(包括下面所有子目录和子文件)
    /// </summary>
    /// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>
    /*
    * 例:删除test目录
    FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");
    helper.RemoveDirectory("web/test");
    */
    public void RemoveDirectory(string remoteDirectoryName)
    {
    GotoDirectory(remoteDirectoryName, true);
    var listAll = ListFilesAndDirectories();
    foreach (var m in listAll)
    {
    if (m.IsDirectory)
    RemoveDirectory(m.Path);
    else
    DeleteFile(m.Name);
    }
    GotoDirectory(remoteDirectoryName, true);
    response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
    }
    /// <summary>
    /// 文件上传
    /// </summary>
    /// <param name="localFilePath">本地文件路径</param>
    public void Upload(string localFilePath)
    {
    FileInfo fileInf = new FileInfo(localFilePath);
    request = OpenRequest(new Uri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);
    request.ContentLength = fileInf.Length;
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
    int contentLen;
    using (var fs = fileInf.OpenRead())
    {
    using (var strm = request.GetRequestStream())
    {
    contentLen = fs.Read(buff, 0, buffLength);
    while (contentLen != 0)
    {
    strm.Write(buff, 0, contentLen);
    contentLen = fs.Read(buff, 0, buffLength);
    }
    }
    }
    }
    /// <summary>
    /// 删除文件
    /// </summary>
    /// <param name="remoteFileName">要删除的文件名</param>
    public void DeleteFile(string remoteFileName)
    {
    response = Open(new Uri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);
    }

    /// <summary>
    /// 获取当前目录的文件和一级子目录信息
    /// </summary>
    /// <returns></returns>
    public List<FileStruct> ListFilesAndDirectories()
    {
    var fileList = new List<FileStruct>();
    response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);
    using (var stream = response.GetResponseStream())
    {
    using (var sr = new StreamReader(stream))
    {
    string line = null;
    while ((line = sr.ReadLine()) != null)
    {
    //line的格式如下:
    //08-18-13 11:05PM <DIR> aspnet_client
    //09-22-13 11:39PM 2946 Default.aspx
    //DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null);
    //DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));
    string[] arrs = line.Split(' ');
    var model = new FileStruct()
    {
    IsDirectory = line.IndexOf("<DIR>") > 0 ? true : false,
    CreateTime = DateTime.Now,
    Name = arrs[arrs.Length - 1],
    Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]
    };
    fileList.Add(model);
    }
    }
    }
    return fileList;
    }
    /// <summary>
    /// 列出当前目录的所有文件
    /// </summary>
    public List<FileStruct> ListFiles()
    {
    var listAll = ListFilesAndDirectories();
    Predicate<FileStruct> findValue = delegate(FileStruct p)
    {
    return p.IsDirectory == false;
    };
    var listFile = listAll.FindAll(findValue);
    return listFile;
    }
    /// <summary>
    /// 列出当前目录的所有一级子目录
    /// </summary>
    public List<FileStruct> ListDirectories()
    {
    var listAll = ListFilesAndDirectories();
    Predicate<FileStruct> findValue = delegate(FileStruct p)
    {
    return p.IsDirectory == true;
    };
    var listFile = listAll.FindAll(findValue);
    return listFile;
    }
    /// <summary>
    /// 判断当前目录下指定的子目录或文件是否存在
    /// </summary>
    /// <param name="remoteName">指定的目录或文件名</param>
    public bool IsExist(string remoteName)
    {
    var list = ListFilesAndDirectories();
    Predicate<FileStruct> findValue = delegate(FileStruct p)
    {
    return p.Name == remoteName;
    };
    var listFile = list.FindAll(findValue);
    if (listFile.Count > 0)
    return true;
    return false;
    }
    /// <summary>
    /// 判断当前目录下指定的一级子目录是否存在
    /// </summary>
    /// <param name="RemoteDirectoryName">指定的目录名</param>
    public bool IsDirectoryExist(string remoteDirectoryName)
    {
    var listDir = ListDirectories();
    Predicate<FileStruct> findValue = delegate(FileStruct p)
    {
    return p.Name == remoteDirectoryName;
    };
    var listFile = listDir.FindAll(findValue);
    if (listFile.Count > 0)
    return true;
    return false;
    }
    /// <summary>
    /// 判断当前目录下指定的子文件是否存在
    /// </summary>
    /// <param name="RemoteFileName">远程文件名</param>
    public bool IsFileExist(string remoteFileName)
    {
    var listFile = ListFiles();
    Predicate<FileStruct> findValue = delegate(FileStruct p)
    {
    return p.Name == remoteFileName;
    };
    var lFile = listFile.FindAll(findValue);
    if (lFile.Count > 0)
    return true;
    return false;
    }

    /// <summary>
    /// 下载
    /// </summary>
    /// <param name="saveFilePath">下载后的保存路径</param>
    /// <param name="downloadFileName">要下载的文件名</param>
    public void Download(string saveFilePath, string downloadFileName)
    {
    using (FileStream outputStream = new FileStream(saveFilePath + "\" + downloadFileName, FileMode.Create))
    {
    response = Open(new Uri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile);
    using (Stream ftpStream = response.GetResponseStream())
    {
    long cl = response.ContentLength;
    int bufferSize = 2048;
    int readCount;
    byte[] buffer = new byte[bufferSize];
    readCount = ftpStream.Read(buffer, 0, bufferSize);
    while (readCount > 0)
    {
    outputStream.Write(buffer, 0, readCount);
    readCount = ftpStream.Read(buffer, 0, bufferSize);
    }
    }
    }
    }


    }

    public class FileStruct
    {
    /// <summary>
    /// 是否为目录
    /// </summary>
    public bool IsDirectory { get; set; }
    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime CreateTime { get; set; }
    /// <summary>
    /// 文件或目录名称
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 路径
    /// </summary>
    public string Path { get; set; }
    }
    }

  • 相关阅读:
    函数声明与函数指针
    【LeetCode】三角形最小路径和
    【LeetCode】字符串中的第一个唯一字符
    【LeetCode】基本计算器II
    【LeetCode】二叉树的最小深度
    【LeetCode】加油站
    java中json与对象的转换
    idea2017 无法使用maven3.6.3版本导入依赖
    springboot项目注册为windows系统服务并设置开机自启
    springmvc上传文件
  • 原文地址:https://www.cnblogs.com/wangchuang/p/4748659.html
Copyright © 2020-2023  润新知