自己在用的FTP类,实现了检查FTP链接以及返回FTP没有反应的情况。
public delegate void ShowError(string content, string title); ////// 使用FtpWebRequest进行FTP操作 /// public class VeviFtpHelper:IDisposable { string ftpHost;//FTP HostName or IPAddress string ftpUserID; string ftpPassword; int port = 21; string ftpName; ////// FTP根目录URI /// string ftpRootURI; ////// FTP的IP地址 /// string ftpIPAddress; FtpWebRequest reqFTP; // bool isconnect = false; #region 属性 ////// FTP根目录URI /// 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 判断是否存在 ////// FTP测试 /// ///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; } } /// /// FTP是否存在 /// ftp路径 ///的路径 /// 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路径不存在!\r\n" + e1.Message, "连接失败"); DisConnect(); return false; } } /// /// 是否存在文件 /// /// /// /// ///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); } /// /// 是否存在文件夹 /// /// /// /// ///public bool ExistFolder(string path, string folderName, out string info) { return GetFolderList(path, out info).Contains(folderName); } #endregion #region 获取信息 /// /// 获取文件列表 /// /// ftp目录路径 /// 0 failed 1 success ///文件名称列表 public IListGetFileList(string path, out string info) { return GetFTPPathList(path, "file", out info); } /// /// 获取目录的列表 /// /// ftp目录路径 /// 0 failed 1 success ///目录的列表 public IListGetFolderList(string path, out string info) { return GetFTPPathList(path, "folder", out info); } /// /// 获取FTP /// Ftp路径 /// 0/file is File 1/Folder is Folder /// 0 failed 1 success ///下的所有内容 /// 文件或文件夹列表 public IListGetFTPPathList(string path, string getType, out string info) { IList fileList = new List (); // 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("路径不存在\r\n" + ex.Message, "获取文件夹"); fileList = new List (); info = "0"; DisConnect(); return fileList; } } /// /// 处理得到的信息流,判断是文件还是文件夹 /// /// /// ///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) == " ") { 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 文件操作 /// /// 上传文件 /// /// 文件上传到的ftp路径 /// 源文件地址 /// ftp中此文件的名称 ///是否成功 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; } } ////// 上传文件 /// /// 文件上传到的ftp路径 /// 源文件地址 ///是否成功 public bool UploadFile(string path, string oriFilePath) { string ftpFileName = System.IO.Path.GetFileName(oriFilePath); return UploadFile(path, oriFilePath, ftpFileName); } ////// 删除文件 /// /// ///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("删除文件失败!\r\n" + ex.Message, "删除文件"); DisConnect(); return false; } } /// /// 下载文件 /// /// ftp中文件的路径,包含文件名 /// 保存下载文件的路径 ///public bool DownLoadFile(string ftpFilePath, string savePath) { string fileName = System.IO.Path.GetFileName(ftpFilePath); return DownLoadFile(ftpFilePath, savePath, fileName); } /// /// /// /// ftp中文件的路径,包含文件名 /// 保存下载文件的路径 /// 保存文件的名称 ///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("下载文件失败!\r\n" + ex.Message, "下载文件"); DisConnect(); return false; } } #endregion #region 创建目录 /// /// 创建目录 /// /// 当前FTP目录 /// 文件夹名称 ///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; } } /// /// 创建目录 /// /// FTP目录 ///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 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 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); } /// /// 只删除文件夹 /// /// ///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("删除文件夹失败!\r\n" + ex.Message, "删除文件夹"); DisConnect(); return false; } } #endregion /// /// 重命名文件名或文件夹名称 /// /// /// 新的文件名或文件夹名称 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("重命名失败!\r\n" + ex.Message, "重命名"); DisConnect(); return false; } } #endregion #region IDisposable 成员 public void Dispose() { if (reqFTP != null) reqFTP.Abort(); } #endregion }