zoukankan      html  css  js  c++  java
  • 关于FTP操作的功能类

    自己在用的FTP类,实现了检查FTP链接以及返回FTP没有反应的情况。

     public delegate void ShowError(string content, string title);
        /// <summary>
        /// 使用FtpWebRequest进行FTP操作
        /// </summary>
        public class VeviFtpHelper:IDisposable
        {
            string ftpHost;//FTP HostName or IPAddress
            string ftpUserID;
            string ftpPassword;
            int port = 21;
            string ftpName;
            /// <summary>
            /// FTP根目录URI
            /// </summary>
            string ftpRootURI;
            /// <summary>
            /// FTP的IP地址
            /// </summary>
            string ftpIPAddress;
            FtpWebRequest reqFTP;
            //
            bool isconnect = false;
            #region 属性
            /// <summary>
            /// FTP根目录URI
            /// </summary>
            public string FTPRootURI
            {
                get { return ftpRootURI; }
            }
            #endregion
            #region 事件
            public event ShowError ShowErrorEvent;
            private void ErrorNotify(string content, string title)
            {
                if (ShowErrorEvent != null)
                    ShowErrorEvent(content, title);
            }
            #endregion
            #region 构造函数
            public VeviFtpHelper(string hostName, string userID, string passWord)
            {
                ftpHost = hostName;
                ftpUserID = userID;
                ftpPassword = passWord;
                PrepareFTPInfo();
            }
            public VeviFtpHelper(string hostName, string userID, string passWord, int port):this(hostName,userID,passWord)
            {
                this.port = port;
                PrepareFTPInfo();
            }
            public VeviFtpHelper(string hostName, string ftpName, string userID, string passWord)
                : this(hostName, userID, passWord)
            {
                this.ftpName = ftpName;
                PrepareFTPInfo();
            }
            public VeviFtpHelper(string hostName, string ftpName, string userID, string passWord, int port)
                : this(hostName,ftpName, userID, passWord)
            {
                this.port = port;
                this.ftpName = ftpName;
                PrepareFTPInfo();
            }
            #endregion
            public bool PrepareFTPInfo()
            {
                try
                {
                    IPEndPoint remoteEndPoint = new IPEndPoint
                            (IPAddress.Parse(ftpHost), port);
                    ftpIPAddress = remoteEndPoint.Address.ToString();
                    ftpRootURI = "ftp://" + ftpIPAddress + "/";
                    if (!string.IsNullOrEmpty(ftpName))
                        ftpRootURI += ftpName + "/";
                }
                catch (FormatException)
                {
                    ErrorNotify("FTP地址的格式不正确,或者连接不到FTP主机。", "FTP地址错误");
                    return false;
                }
                catch (Exception ex)
                {
                    ErrorNotify(ex.Message, "连接错误");
                    return false;
                }
                return true;
            }
            private bool Connect(string path)
            {
                try
                {
                    if (!PrepareFTPInfo())
                        return false;
                    if (string.IsNullOrEmpty(path))
                        path = ftpRootURI;
                    //connect to ftp
                    // 根据uri创建FtpWebRequest对象
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
                    // 指定数据传输类型
                    reqFTP.UseBinary = true;
                    // ftp用户名和密码
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                    //
                    isconnect = true;
                }
                catch (FormatException)
                {
                    DisConnect();
    
                    ErrorNotify("FTP地址的格式不正确,或者连接不到FTP主机。", "FTP地址错误");
                    return false;
                }
                catch (Exception ex)
                {
                    DisConnect();
    
                    ErrorNotify(ex.Message, "连接错误");
                    return false;
                }
                return true;
            }
            private void DisConnect()
            {
                isconnect = false;
            }
            #region Methods
            #region 判断是否存在
            /// <summary>
            /// FTP测试
            /// </summary>
            /// <returns></returns>
            public bool ExistFTP()
            {
                if (!Connect(""))
                {
                    return false;
                }
                try
                {
                    reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                    WebResponse response = reqFTP.GetResponse();
                    StreamReader reader = new StreamReader
                        (response.GetResponseStream(), System.Text.Encoding.Default);
                    string line = reader.ReadLine();
                    return true;
                }
                catch (Exception e1)
                {
                    DisConnect();
                    ErrorNotify(e1.Message, "连接失败");
                    return false;
                }
            }
            /// <summary>
            /// FTP是否存在<paramref name="path"/>的路径
            /// </summary>
            /// <param name="path">ftp路径</param>
            /// <returns></returns>
            public bool ExistPath(string path)
            {
                if (!Connect(path))
                    return false;
                try
                {
                    reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                    WebResponse response = reqFTP.GetResponse();
                    StreamReader reader = new StreamReader
                        (response.GetResponseStream(), System.Text.Encoding.Default);
                    string line = reader.ReadLine();
                    DisConnect();
                    return true;
                }
                catch (Exception e1)
                {
                    ErrorNotify("FTP路径不存在!
    " + e1.Message, "连接失败");
                    DisConnect();
                    return false;
                }
            }
            /// <summary>
            /// 是否存在文件
            /// </summary>
            /// <param name="path"></param>
            /// <param name="fileName"></param>
            /// <param name="info"></param>
            /// <returns></returns>
            public bool ExistFile(string path, string fileName, out string info)
            {
                return GetFileList(path, out info).Contains(fileName);
            }
            public bool ExistFile(string path, string fileName)
            {
                string info;
                return GetFileList(path, out info).Contains(fileName);
            }
            /// <summary>
            /// 是否存在文件夹
            /// </summary>
            /// <param name="path"></param>
            /// <param name="folderName"></param>
            /// <param name="info"></param>
            /// <returns></returns>
            public bool ExistFolder(string path, string folderName, out string info)
            {
                return GetFolderList(path, out info).Contains(folderName);
            }
            #endregion
            #region 获取信息
            /// <summary>
            /// 获取文件列表
            /// </summary>
            /// <param name="path">ftp目录路径</param>
            /// <param name="info">0 failed 1 success</param>
            /// <returns>文件名称列表</returns>
            public IList<string> GetFileList(string path, out string info)
            {
                return GetFTPPathList(path, "file", out info);
            }
            /// <summary>
            /// 获取目录的列表
            /// </summary>
            /// <param name="path">ftp目录路径</param>
            /// <param name="info">0 failed 1 success</param>
            /// <returns>目录的列表</returns>
            public IList<string> GetFolderList(string path, out string info)
            {
                return GetFTPPathList(path, "folder", out info);
            }
    
            /// <summary>
            /// 获取FTP<paramref name="path"/>下的所有内容
            /// </summary>
            /// <param name="path">Ftp路径</param>
            /// <param name="getType">0/file is File 1/Folder is Folder </param>
            /// <param name="info">0 failed 1 success</param>
            /// <returns>文件或文件夹列表</returns>
            public IList<string> GetFTPPathList(string path, string getType, out string info)
            {
                IList<string> fileList = new List<string>();
                //
                if (!Connect(path))
                {
                    info = "0";
                    return fileList;
                }
                try
                {
                    reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                    WebResponse response = reqFTP.GetResponse();
                    StreamReader reader = new StreamReader
                        (response.GetResponseStream(), System.Text.Encoding.Default);
                    string line = reader.ReadLine();
                    while (line != null)
                    {
                        if (!string.IsNullOrEmpty(line))
                        {
                            bool flag;//ture is folder false is file
                            string value = GetListInfo(line, out flag);
                            if (flag == (getType == "1" || getType.Trim().ToLower() == "folder"))
                                fileList.Add(value);
                        }
                        line = reader.ReadLine();
                    }
                    // to remove the trailing '/n'
                    DisConnect();
                    reader.Close();
                    response.Close();
                    info = "1";
                    return fileList;
                }
                catch (Exception ex)
                {
                    //System.Windows.Forms.MessageBox.Show(ex.Message);
                    ErrorNotify("路径不存在
    " + ex.Message, "获取文件夹");
                    fileList = new List<string>();
                    info = "0";
                    DisConnect();
                    return fileList;
                }
            }
            /// <summary>
            /// 处理得到的信息流,判断是文件还是文件夹
            /// </summary>
            /// <param name="line"></param>
            /// <param name="isfloder"></param>
            /// <returns></returns>
            private string GetListInfo(string line, out bool isfloder)
            {
                string processstr = line.Trim();
                string dateStr = processstr.Substring(0, 8);
                processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
                string timeStr = processstr.Substring(0, 7);
                processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
                DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
                myDTFI.ShortTimePattern = "t";
                DateTime CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
    
                if (processstr.Substring(0, 5) == "<DIR>")
                {
                    isfloder = true;
                    processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
                    return processstr;
                }
                else
                {
                    isfloder = false;
                    int idx = processstr.IndexOf(" ");
                    processstr = processstr.Substring(idx, processstr.Length - idx).Trim();
                    //string[] strs = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);  // true);     
                    //processstr = strs[1];
                    return processstr;
                }
            }
            #endregion
            #region 文件操作
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="path">文件上传到的ftp路径</param>
            /// <param name="oriFilePath">源文件地址</param>
            /// <param name="ftpFileName">ftp中此文件的名称</param>
            /// <returns>是否成功</returns>
            public bool UploadFile(string path, string oriFilePath, string ftpFileName)
            {
                string info;
                if (ExistFile(path, ftpFileName, out info))
                {
                    info = "0";
                    ErrorNotify("文件已存在,请重新命名文件!", "上传文件");
                    return false;
                }
                else
                {
                    if (info != "1")
                        return false;
                }
                FileInfo fileInf = new FileInfo(oriFilePath);
                //上传文件路径名称
                string ftpFilePath = (path.EndsWith("/") ? path : path + "/") + ftpFileName;
                //
                if (!Connect(ftpFilePath))
                {
                    info = "0";
                    return false;
                }
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                reqFTP.UseBinary = true;
                reqFTP.ContentLength = fileInf.Length;
                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;
                FileStream fs = fileInf.OpenRead();
                try
                {
                    Stream strm = reqFTP.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();
                    DisConnect();
                    info = "1";
                    return true;
                }
                catch (Exception ex)
                {
                    ErrorNotify(ex.Message, "上传文件");
                    info = "0";
                    DisConnect();
                    return false;
                }
            }
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="path">文件上传到的ftp路径</param>
            /// <param name="oriFilePath">源文件地址</param>
            /// <returns>是否成功</returns>
            public bool UploadFile(string path, string oriFilePath)
            {
                string ftpFileName = System.IO.Path.GetFileName(oriFilePath);
                return UploadFile(path, oriFilePath, ftpFileName);
            }
            /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public bool DeleteFile(string filePath)
            {
                if (!Connect(filePath))
                {
                    return false;
                }
                try
                {
                    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();
                    DisConnect();
                    return true;
                }
                catch (Exception ex)
                {
                    ErrorNotify("删除文件失败!
    " + ex.Message, "删除文件");
                    DisConnect();
                    return false;
                }
            }
            /// <summary>
            /// 下载文件
            /// </summary>
            /// <param name="ftpFilePath">ftp中文件的路径,包含文件名</param>
            /// <param name="savePath">保存下载文件的路径</param>
            /// <returns></returns>
            public bool DownLoadFile(string ftpFilePath, string savePath)
            {
                string fileName = System.IO.Path.GetFileName(ftpFilePath);
                return DownLoadFile(ftpFilePath, savePath, fileName);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="ftpFilePath">ftp中文件的路径,包含文件名</param>
            /// <param name="savePath">保存下载文件的路径</param>
            /// <param name="downloadFileName">保存文件的名称</param>
            /// <returns></returns>
            public bool DownLoadFile(string ftpFilePath, string savePath, string downloadFileName)
            {
                if (!Connect(ftpFilePath))
                {
                    return false;
                }
                FileStream outputStream=null;// = new FileStream(savePath + "\" + downloadFileName, FileMode.Create);
                try
                {
                    outputStream = new FileStream(savePath + "\" + downloadFileName, FileMode.Create);
                    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                    reqFTP.UseBinary = true;
                    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();
                    DisConnect();
                    return true;
                }
                catch (Exception ex)
                {
                    if (outputStream != null)
                    {
                        outputStream.Close();
                        if (File.Exists(savePath + "\" + downloadFileName))
                            File.Delete(savePath + "\" + downloadFileName);
                    }
                    ErrorNotify("下载文件失败!
    " + ex.Message, "下载文件");
                    DisConnect();
                    return false;
                }
            }
            #endregion
            #region 创建目录
            /// <summary>
            /// 创建目录
            /// </summary>
            /// <param name="path">当前FTP目录</param>
            /// <param name="folderName">文件夹名称</param>
            /// <returns></returns>
            public bool CreateFolder(string path, string folderName)
            {
                string info;
                if (ExistFolder(path, folderName, out info))
                {
                    info = "1";
                    ErrorNotify("文件夹已存在!", "创建文件夹");
                    return true;
                }
                else
                {
                    if (info != "1")
                        return false;
                }
                //
                string ftpFolderpath = (path.EndsWith("/") ? path : path + "/") + folderName;
                //
                if (!Connect(ftpFolderpath))
                {
                    info = "0";
                    return false;
                }
                try
                {
                    reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                    reqFTP.UseBinary = true;
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    Stream ftpStream = response.GetResponseStream();
                    //
                    ftpStream.Close();
                    response.Close();
                    info = "1";
                    DisConnect();
                    return true;
                }
                catch (Exception e1)
                {
                    ErrorNotify(e1.Message, "创建文件夹");
                    info = "0";
                    DisConnect();
                    return false;
                }
            }
            /// <summary>
            /// 创建目录
            /// </summary>
            /// <param name="folderPath">FTP目录</param>
            /// <returns></returns>
            public bool CreateFolder(string folderPath)
            {
                int idx = folderPath.LastIndexOf("/");
                string path = folderPath.Substring(0, idx);
                string folderName = folderPath.Substring(idx, folderPath.Length - idx);
                return CreateFolder(path, folderName);
            }
    
            public bool DeleteFolder(string ftpPath)
            {
                if (ftpPath == ftpRootURI)
                {
                    ErrorNotify("FTP根目录无法删除!", "删除文件夹");
                    return false;
                }
                //遍历所有的子文件夹
                string info;
                IList<string> folderList = GetFolderList(ftpPath, out info);
                if (info == "1")
                {
                    foreach (string folderName in folderList)
                    {
                        string newPath = (ftpPath.EndsWith("/") ? ftpPath : ftpPath + "/") + folderName;
                        if (!DeleteFolder(newPath))
                            return false;
                    }
                }
                else//连接出错
                    return false;
                //删除当前目录下的文件
                IList<string> fileList = GetFileList(ftpPath, out info);
                if (info == "1")
                {
                    foreach (string fileName in fileList)
                        if (!DeleteFile((ftpPath.EndsWith("/") ? ftpPath : ftpPath + "/") + fileName))
                            return false;
                }
                else return false;
                //删除自己
                return DeleteOnlyFolder(ftpPath);
    
            }
            /// <summary>
            /// 只删除文件夹
            /// </summary>
            /// <param name="ftpPath"></param>
            /// <returns></returns>
            private bool DeleteOnlyFolder(string ftpPath)
            {
                if (!Connect(ftpPath))
                {
                    return false;
                }
                try
                {
                    reqFTP.UseBinary = true;
                    //reqFTP.UsePassive = false;
                    reqFTP.KeepAlive = false;
                    reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    response.Close();
                    DisConnect();
                    return true;
                }
                catch (Exception ex)
                {
                    ErrorNotify("删除文件夹失败!
    " + ex.Message, "删除文件夹");
                    DisConnect();
                    return false;
                }
            }
            #endregion
            /// <summary>
            /// 重命名文件名或文件夹名称
            /// </summary>
            /// <param name="currentFtpFilePath"></param>
            /// <param name="newFilename">新的文件名或文件夹名称</param>
            public bool ReName(string currentFtpFilePath, string newFilename)
            {
                if (!Connect(currentFtpFilePath))
                {
                    return false;
                }
                try
                {
                    reqFTP.Method = WebRequestMethods.Ftp.Rename;
                    reqFTP.RenameTo = newFilename;
                    reqFTP.UseBinary = true;
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    Stream ftpStream = response.GetResponseStream();
    
                    ftpStream.Close();
                    response.Close();
                    DisConnect();
                    return true;
                }
                catch (Exception ex)
                {
                    ErrorNotify("重命名失败!
    " + ex.Message, "重命名");
                    DisConnect();
                    return false;
                }
            }
            #endregion
    
            #region IDisposable 成员
    
            public void Dispose()
            {
                if (reqFTP != null)
                    reqFTP.Abort();
            }
    
            #endregion
        }



  • 相关阅读:
    Applet
    Tutorial中代码的区别及不同效果
    Session
    代码解析&Filter用户授权例子
    Web的后台运作过程
    XML
    数据库
    spring常用注解
    spring mvc 常用注解
    @requestMapping
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3322928.html
Copyright © 2011-2022 走看看