【愚公系列】2022年03月 C#帮助类-FTP的花样操作

举报
愚公搬代码 发表于 2022/03/02 15:59:59 2022/03/02
【摘要】 前言文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。FTP允许用户以文件操作的方式(如文...

前言

文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

一、FTP的花样操作

1.配置文件

public class FTPConfig
{
    /// <summary>
    /// 
    /// </summary>
    public FTPConfig()
    {
        IsUpload = false;
        FtpServerIP = "127.0.0.1";
        FtpRemotePath = "";
        FtpUserID = "ftpTest";
        FtpPassword = "a123456.";
    }

    /// <summary>
    /// 是否上传
    /// </summary>
    public bool IsUpload { get; set; }

    /// <summary>
    /// FTP的IP地址
    /// </summary>
    public string FtpServerIP { get; set; }

    /// <summary>
    /// 上传FTP目录
    /// </summary>
    public string FtpRemotePath { get; set; }

    /// <summary>
    /// 用户名
    /// </summary>
    public string FtpUserID { get; set; }

    /// <summary>
    /// 密码
    /// </summary>
    public string FtpPassword { get; set; }
}

2.FTP的操作封装类

public class FTPHelp
{
    private string ftpURI;
    private FTPConfig ftpConfig { get; set; }

    /// <summary>
    ///  连接FTP
    /// </summary>
    /// <param name="ftpConfig"></param>
    public FTPHelp(FTPConfig ftpConfig)
    {
        this.ftpConfig = ftpConfig;
        if (string.IsNullOrEmpty(this.ftpConfig.FtpRemotePath))
        {
            ftpURI = "ftp://" + this.ftpConfig.FtpServerIP + "/";
        }
        else
        {
            ftpURI = "ftp://" + this.ftpConfig.FtpServerIP + "/" + this.ftpConfig.FtpRemotePath + "/";
        }
    }
    
    /// <summary>
    /// 上传
    /// </summary>
    /// <param name="filename"></param>
    public void Upload(string filename)
    {
        if (ftpConfig.IsUpload)
        {
            FileInfo fileInfo = new FileInfo(filename);
            string uri = ftpURI + fileInfo.Name;
            FtpWebRequest reqFTP;

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = fileInfo.Length;

            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            using (FileStream fs = fileInfo.OpenRead())
            {
                using (Stream strm = reqFTP.GetRequestStream())
                {
                    try
                    {
                        contentLen = fs.Read(buff, 0, buffLength);
                        while (contentLen != 0)
                        {
                            strm.Write(buff, 0, contentLen);
                            contentLen = fs.Read(buff, 0, buffLength);
                        }
                        strm.Close();
                        fs.Close();
                    }
                    catch (Exception ex)
                    {
                        string errorMessage = "Upload Error --> " + ex.Message;
                        //logger.Error(errorMessage);
                        throw;
                    }
                }
            }
        }
        else
        {
            //logger.Debug("[UploadData] uploadConfig.IsUpload is false,abort to loaddata");
        }
    }

    /// <summary>
    /// 下载
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="fileName"></param>
    public void Download(string filePath, string fileName)
    {
        FtpWebRequest reqFTP;
        try
        {
            FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.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);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            string errorMessage = "Download Error --> " + ex.Message;
            //logger.Error(errorMessage);
            throw;
        }
    }

    /// <summary>
    /// 删除文件
    /// </summary>
    /// <param name="fileName"></param>
    public void Delete(string fileName)
    {
        try
        {
            string uri = ftpURI + fileName;
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;

            string result = String.Empty;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            long size = response.ContentLength;
            Stream datastream = response.GetResponseStream();
            StreamReader sr = new StreamReader(datastream);
            result = sr.ReadToEnd();
            sr.Close();
            datastream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            string errorMessage = "Delete Error --> " + ex.Message + "  文件名:" + fileName;
            //logger.Error(errorMessage);
            throw;
        }
    }

    /// <summary>
    /// 删除文件夹
    /// </summary>
    /// <param name="folderName"></param>
    public void RemoveDirectory(string folderName)
    {
        try
        {
            string uri = ftpURI + folderName;
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;

            string result = String.Empty;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            long size = response.ContentLength;
            Stream datastream = response.GetResponseStream();
            StreamReader sr = new StreamReader(datastream);
            result = sr.ReadToEnd();
            sr.Close();
            datastream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            string errorMessage = "Delete Error --> " + ex.Message + "  文件名:" + folderName;
            //logger.Error(errorMessage);
            throw;
        }
    }

    /// <summary>
    /// 获取当前目录下明细(包含文件和文件夹)
    /// </summary>
    /// <returns></returns>
    public string[] GetFilesDetailList()
    {
        string[] downloadFiles;
        try
        {
            StringBuilder result = new StringBuilder();
            FtpWebRequest ftp;
            ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
            ftp.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            WebResponse response = ftp.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);

            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)
        {
            downloadFiles = null;
            //logger.Error(ex);
            return downloadFiles;
        }
    }

    /// <summary>
    /// 获取当前目录下文件列表(仅文件)
    /// </summary>
    /// <returns></returns>
    public string[] GetFileList(string mask)
    {
        string[] downloadFiles;
        StringBuilder result = new StringBuilder();
        FtpWebRequest reqFTP;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            WebResponse response = reqFTP.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);

            string line = reader.ReadLine();
            while (line != null)
            {
                if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
                {
                    string mask_ = mask.Substring(0, mask.IndexOf("*"));
                    if (line.Substring(0, mask_.Length) == mask_)
                    {
                        result.Append(line);
                        result.Append("\n");
                    }
                }
                else
                {
                    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)
        {
            downloadFiles = null;
            if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
            {
                string errorMessage = "GetFileList Error --> " + ex.Message.ToString();
                //logger.Error(errorMessage);
            }
            return downloadFiles;
        }
    }

    /// <summary>
    /// 获取当前目录下所有的文件夹列表(仅文件夹)
    /// </summary>
    /// <returns></returns>
    public string[] GetDirectoryList()
    {
        string[] drectory = GetFilesDetailList();
        string m = string.Empty;
        foreach (string str in drectory)
        {
            int dirPos = str.IndexOf("<DIR>");
            if (dirPos > 0)
            {
                /*判断 Windows 风格*/
                m += str.Substring(dirPos + 5).Trim() + "\n";
            }
            else if (str.Trim().Substring(0, 1).ToUpper() == "D")
            {
                /*判断 Unix 风格*/
                string dir = str.Substring(49).Trim();
                if (dir != "." && dir != "..")
                {
                    m += dir + "\n";
                }
            }
        }

        char[] n = new char[] { '\n' };
        return m.Split(n);
    }

    /// <summary>
    /// 判断当前目录下指定的子目录是否存在
    /// </summary>
    /// <param name="RemoteDirectoryName">指定的目录名</param>
    public bool DirectoryExist(string RemoteDirectoryName)
    {
        string[] dirList = GetDirectoryList();
        foreach (string str in dirList)
        {
            if (str.Trim() == RemoteDirectoryName.Trim())
            {
                return true;
            }
        }
        return false;
    }

    /// <summary>
    /// 判断当前目录下指定的文件是否存在
    /// </summary>
    /// <param name="RemoteFileName">远程文件名</param>
    public bool FileExist(string RemoteFileName)
    {
        string[] fileList = GetFileList("*.*");
        foreach (string str in fileList)
        {
            if (str.Trim() == RemoteFileName.Trim())
            {
                return true;
            }
        }
        return false;
    }

    /// <summary>
    /// 创建文件夹
    /// </summary>
    /// <param name="dirName"></param>
    public void MakeDir()
    {
        if (!string.IsNullOrEmpty(ftpConfig.FtpRemotePath))
        {
            FtpWebRequest reqFTP;
            try
            {
                // dirName = name of the directory to create.
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                string errorMesasge = "MakeDir Error --> " + ex.Message;
                //logger.Error(errorMesasge);
                throw;
            }
        }
    }

    /// <summary>
    /// 获取指定文件大小
    /// </summary>
    /// <param name="filename"></param>
    /// <returns></returns>
    public long GetFileSize(string filename)
    {
        FtpWebRequest reqFTP;
        long fileSize = 0;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
            reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            fileSize = response.ContentLength;

            ftpStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            string errorMesasge = "GetFileSize Error --> " + ex.Message;
            //logger.Error(errorMesasge);
            throw;
        }
        return fileSize;
    }

    /// <summary>
    /// 改名
    /// </summary>
    /// <param name="currentFilename"></param>
    /// <param name="newFilename"></param>
    public void ReName(string currentFilename, string newFilename)
    {
        FtpWebRequest reqFTP;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
            reqFTP.Method = WebRequestMethods.Ftp.Rename;
            reqFTP.RenameTo = newFilename;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword);
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();

            ftpStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            string errorMesasge = "ReName Error --> " + ex.Message;
            //logger.Error(errorMesasge);
            throw;
        }
    }

    /// <summary>
    /// 移动文件
    /// </summary>
    /// <param name="currentFilename"></param>
    /// <param name="newDirectory"></param>
    public void MovieFile(string currentFilename, string newDirectory)
    {
        ReName(currentFilename, newDirectory);
    }

    /// <summary>
    /// 切换当前目录
    /// </summary>
    /// <param name="DirectoryName"></param>
    /// <param name="IsRoot">true 绝对路径   false 相对路径</param>
    public void GotoDirectory(string DirectoryName, bool IsRoot)
    {
        if (IsRoot)
        {
            ftpConfig.FtpRemotePath = DirectoryName;
        }
        else
        {
            ftpConfig.FtpRemotePath += DirectoryName + "/";
        }
        ftpURI = "ftp://" + ftpConfig.FtpServerIP + "/" + ftpConfig.FtpRemotePath + "/";
    }

    /// <summary>
    /// 删除订单目录
    /// </summary>
    /// <param name="ftpConfig"></param>
    /// <param name="folderToDelete"></param>
    public static void DeleteOrderDirectory(FTPConfig ftpConfig, string folderToDelete)
    {
        try
        {
            if (!string.IsNullOrEmpty(ftpConfig.FtpServerIP) &&
                !string.IsNullOrEmpty(folderToDelete) &&
                !string.IsNullOrEmpty(ftpConfig.FtpUserID) &&
                !string.IsNullOrEmpty(ftpConfig.FtpPassword))
            {
                FTPTestViewModel fw = new FTPTestViewModel(ftpConfig);
                //进入订单目录
                fw.GotoDirectory(folderToDelete, true);
                //获取规格目录
                string[] folders = fw.GetDirectoryList();
                foreach (string folder in folders)
                {
                    if (!string.IsNullOrEmpty(folder) || folder != "")
                    {
                        //进入订单目录
                        string subFolder = folderToDelete + "/" + folder;
                        fw.GotoDirectory(subFolder, true);
                        //获取文件列表
                        string[] files = fw.GetFileList("*.*");
                        if (files != null)
                        {
                            //删除文件
                            foreach (string file in files)
                            {
                                fw.Delete(file);
                            }
                        }
                        //删除冲印规格文件夹
                        fw.GotoDirectory(folderToDelete, true);
                        fw.RemoveDirectory(folder);
                    }
                }

                //删除订单文件夹
                string parentFolder = folderToDelete.Remove(folderToDelete.LastIndexOf('/'));
                string orderFolder = folderToDelete.Substring(folderToDelete.LastIndexOf('/') + 1);
                fw.GotoDirectory(parentFolder, true);
                fw.RemoveDirectory(orderFolder);
            }
            else
            {
                throw new Exception("FTP 及路径不能为空!");
            }
        }
        catch (Exception ex)
        {
            throw new Exception("删除订单时发生错误,错误信息为:" + ex.Message);
        }
    }
}

3.使用

public void Upload()
{
    ftpConfig.IsUpload = true;
    Upload(@"D:\temp.png");
    MessageBox.Show("上传完成!!!");
}

public void Download()
{
    Download(@"D:\", "temp.png");
    MessageBox.Show("下载完成!!!");
}

public void Delete()
{
    Delete("temp.png");
    MessageBox.Show("删除完成!!!");
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。