自己在用的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路径不存在!\r\n" + 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("路径不存在\r\n" + 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("删除文件失败!\r\n" + 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("下载文件失败!\r\n" + 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("删除文件夹失败!\r\n" + 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("重命名失败!\r\n" + ex.Message, "重命名");
DisConnect();
return false;
}
}
#endregion #region IDisposable 成员 public void Dispose()
{
if (reqFTP != null)
reqFTP.Abort();
} #endregion
}

关于FTP操作的功能类的更多相关文章

  1. PHP FTP操作类( 上传、拷贝、移动、删除文件/创建目录 )

    /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...

  2. C# FTP操作类的代码

    如下代码是关于C# FTP操作类的代码.using System;using System.Collections.Generic;using System.Text;using System.Net ...

  3. 【转载】C#工具类:FTP操作辅助类FTPHelper

    FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样.可以通过C#中的FtpWebRequest类.NetworkCredential类.We ...

  4. php的FTP操作类

    class_ftp.php <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状 ...

  5. [PHP学习教程 - 类库]002.FTP操作(FTP)

    引言:FTP是大家上传至站点服务器必须要使用的协议.现在常用的FTP客户端工具也很多,如:8uftp,FlashFXP,....但是使用客户端工具就无法真正与自动化联系起来.所以今天,我们为大家讲一下 ...

  6. Ubuntu下VSFTPD(六)(常见FTP命令及其功能) (

    常见FTP命令及其功能  FTP 命令 功能  FTP 命令 功能  ls 显示服务器上的目录 ls [remote-dir][local-file] 显示远程目录remote-dir,并存入本地文件 ...

  7. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  8. C# FTP操作

    using System; using System.Collections.Generic; using System.Net; using System.IO; namespace FTP操作 { ...

  9. PHP - FTP上传文件类

    /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...

随机推荐

  1. 前缀 树 背单词(Remember the Word,LA 3942)

    已哭瞎. 搞了2个多小时的错误居然是在  没有初始化............教训:每个例子一定要考虑到初始化问题.! 每个节点存了一个数组  该数组记录的有26个大小  0-25分别表示记录表示'a' ...

  2. BSTR、char*和CString转换

    (1) char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行.例如: char chArray[] = "This  ...

  3. Java NIO 转载

    原文:http://www.iteye.com/magazines/132-Java-NIO  Java NIO 系列教程 2014-04-28  编辑 wangguo 评论(71条) 有204256 ...

  4. 浅谈JSP(二)

    一.EL表达式 作用:从作用域(pageContext,request,session,application)中取值,并显示在页面中. 本质:用于替换输出脚本(<%= %>). 1.从作 ...

  5. MySql 数据库定时备份

    1.使用sqldump+任务计划 mysqldump备份成sql文件==============假想环境:MySQL   安装位置:C:\MySQL论坛数据库名称为:bbsMySQL root   密 ...

  6. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  7. Nexus 5 电信破解问题 CDMA_HDR重启会变回LTE

    解决方法是Nexus 5 Field Test Mode -Advanced LTE Settings 关掉LTE 重启就好了 在Android 5.0 下实测成功 如果不行就换一张卡 重新写 重启再 ...

  8. 8,SSO,,eager copy,COW

    针对字符串不同的长度,“编译器”选择不同的优化策略:SSO, eager copy,COW,分别针对短字符串,中等长度字符串,长字符串.不过,现在(2016)的大多数编译器(gcc 4.9.1,vs2 ...

  9. DC游戏《斑鸠》原创赏析[转载]

    游戏背景:      凤来之国本来只是边远地区的一个小国.但现在他们却自称为得到“神之力”的“神通者”,在“选民思想”“和平统一”之类的名义下开始了对各地的武力侵略.      事情的起因是因为凤来之 ...

  10. HDU 2393 Higher Math

    #include <cstdio> #include <string> using namespace std; void swap(int& a,int& b ...