using System;
using System.Collections.Generic;
using System.Net;
using System.IO; namespace HGFTP
{
/// <summary>
/// FTP客户端操作类
/// </summary>
public class FTPTools
{
#region 构造函数
/// <summary>
/// 创建FTP工具
/// <para>
/// 默认不使用SSL,使用二进制传输方式,使用被动模式
/// </para>
/// </summary>
/// <param name="host">主机名称</param>
/// <param name="userId">用户名</param>
/// <param name="password">密码</param>
public FTPTools(string host, string userId, string password)
: this(host, userId, password, 21, null, false, true, true)
{
} /// <summary>
/// 创建FTP工具
/// </summary>
/// <param name="host">主机名称</param>
/// <param name="userId">用户名</param>
/// <param name="password">密码</param>
/// <param name="port">端口</param>
/// <param name="enableSsl">允许Ssl</param>
/// <param name="proxy">代理</param>
/// <param name="useBinary">允许二进制</param>
/// <param name="usePassive">允许被动模式</param>
public FTPTools(string host, string userId, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive)
{
this.userId = userId;
this.password = password;
if (host.ToLower().StartsWith("ftp://"))
{
this.host = host;
}
else
{
this.host = "ftp://" + host;
}
this.port = port;
this.proxy = proxy;
this.enableSsl = enableSsl;
this.useBinary = useBinary;
this.usePassive = usePassive;
}
#endregion #region 主机
private string host = string.Empty;
/// <summary>
/// 主机
/// </summary>
public string Host
{
get
{
return this.host ?? string.Empty;
}
}
#endregion #region 登录用户名
private string userId = string.Empty;
/// <summary>
/// 登录用户名
/// </summary>
public string UserId
{
get
{
return this.userId;
}
}
#endregion #region 密码
private string password = string.Empty;
/// <summary>
/// 密码
/// </summary>
public string Password
{
get
{
return this.password;
}
}
#endregion #region 代理
IWebProxy proxy = null;
/// <summary>
/// 代理
/// </summary>
public IWebProxy Proxy
{
get
{
return this.proxy;
}
set
{
this.proxy = value;
}
}
#endregion #region 端口
private int port = 21;
/// <summary>
/// 端口
/// </summary>
public int Port
{
get
{
return port;
}
set
{
this.port = value;
}
}
#endregion #region 设置是否允许Ssl
private bool enableSsl = false;
/// <summary>
/// EnableSsl
/// </summary>
public bool EnableSsl
{
get
{
return enableSsl;
}
}
#endregion #region 使用被动模式
private bool usePassive = true;
/// <summary>
/// 被动模式
/// </summary>
public bool UsePassive
{
get
{
return usePassive;
}
set
{
this.usePassive = value;
}
}
#endregion #region 二进制方式
private bool useBinary = true;
/// <summary>
/// 二进制方式
/// </summary>
public bool UseBinary
{
get
{
return useBinary;
}
set
{
this.useBinary = value;
}
}
#endregion #region 远端路径
private string remotePath = "/";
/// <summary>
/// 远端路径
/// <para>
/// 返回FTP服务器上的当前路径(可以是 / 或 /a/../ 的形式)
/// </para>
/// </summary>
public string RemotePath
{
get
{
return remotePath;
}
set
{
string result = "/";
if (!string.IsNullOrEmpty(value) && value != "/")
{
result = "/" + value.TrimStart('/').TrimEnd('/') + "/";
}
this.remotePath = result;
}
}
#endregion #region 创建一个FTP连接
/// <summary>
/// 创建一个FTP请求
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="method">请求方法</param>
/// <returns>FTP请求</returns>
private FtpWebRequest CreateRequest(string url, string method)
{
//建立连接
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential(this.userId, this.password);
request.Proxy = this.proxy;
request.KeepAlive = false;//命令执行完毕之后关闭连接
request.UseBinary = useBinary;
request.UsePassive = usePassive;
request.EnableSsl = enableSsl;
request.Method = method;
return request;
}
#endregion #region 上传一个文件到远端路径下
/// <summary>
/// 把文件上传到FTP服务器的RemotePath下
/// </summary>
/// <param name="localFile">本地文件信息</param>
/// <param name="remoteFileName">要保存到FTP文件服务器上的名称</param>
public bool Upload(FileInfo localFile, string remoteFileName)
{
bool result = false;
if (localFile.Exists)
{
string url = Host.TrimEnd('/') + RemotePath + remoteFileName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.UploadFile); //上传数据
using (Stream rs = request.GetRequestStream())
using (FileStream fs = localFile.OpenRead())
{
byte[] buffer = new byte[4096];//4K
int count = fs.Read(buffer, 0, buffer.Length);
while (count > 0)
{
rs.Write(buffer, 0, count);
count = fs.Read(buffer, 0, buffer.Length);
}
fs.Close();
result = true;
}
return result;
}
throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
}
#endregion #region 从FTP服务器上下载文件
/// <summary>
/// 从当前目录下下载文件
/// <para>
/// 如果本地文件存在,则从本地文件结束的位置开始下载.
/// </para>
/// </summary>
/// <param name="serverName">服务器上的文件名称</param>
/// <param name="localName">本地文件名称</param>
/// <returns>返回一个值,指示是否下载成功</returns>
public bool Download(string serverName, string localName)
{
bool result = false;
//Directory.CreateDirectory(localName);
//DirectoryInfo dirInfo = new DirectoryInfo(localName); using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate)) //创建或打开本地文件
{
//建立连接
string url = Host.TrimEnd('/') + serverName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DownloadFile);
request.ContentOffset = fs.Length;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
fs.Position = fs.Length;
byte[] buffer = new byte[4096];//4K
int count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
while (count > 0)
{
fs.Write(buffer, 0, count);
count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
}
response.GetResponseStream().Close();
}
result = true;
}
return result;
}
#endregion #region 重命名FTP服务器上的文件
/// <summary>
/// 文件更名
/// </summary>
/// <param name="oldFileName">原文件名</param>
/// <param name="newFileName">新文件名</param>
/// <returns>返回一个值,指示更名是否成功</returns>
public bool Rename(string oldFileName, string newFileName)
{
bool result = false;
//建立连接
string url = Host.TrimEnd('/') + RemotePath + oldFileName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.Rename);
request.RenameTo = newFileName;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = true;
}
return result;
}
#endregion #region 从当前目录下获取文件列表
/// <summary>
/// 获取当前目录下文件列表
/// </summary>
/// <returns></returns>
public List<string> GetFileList()
{
List<string> result = new List<string>();
//建立连接
string url = Host.TrimEnd('/') + RemotePath;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectory);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
string line = reader.ReadLine();
while (line != null)
{
result.Add(line);
line = reader.ReadLine();
}
}
return result;
}
#endregion #region 从FTP服务器上获取文件和文件夹列表
/// <summary>
/// 获取详细列表
/// </summary>
/// <returns></returns>
public List<string> GetFileDetails()
{
List<string> result = new List<string>();
//建立连接
string url = Host.TrimEnd('/') + RemotePath;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
string line = reader.ReadLine();
while (line != null)
{
result.Add(line);
line = reader.ReadLine();
}
}
return result;
}
#endregion #region 从FTP服务器上删除文件
/// <summary>
/// 删除FTP服务器上的文件
/// </summary>
/// <param name="fileName">文件名称</param>
/// <returns>返回一个值,指示是否删除成功</returns>
public bool DeleteFile(string fileName)
{
bool result = false;
//建立连接
string url = Host.TrimEnd('/') + RemotePath + fileName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DeleteFile);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = true;
} return result;
}
#endregion #region 在FTP服务器上创建目录
/// <summary>
/// 在当前目录下创建文件夹
/// </summary>
/// <param name="dirName">文件夹名称</param>
/// <returns>返回一个值,指示是否创建成功</returns>
public bool MakeDirectory(string dirName)
{
bool result = false;
//建立连接
string url = Host.TrimEnd('/') + RemotePath + dirName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.MakeDirectory);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = true;
}
return result;
}
#endregion #region 从FTP服务器上删除目录
/// <summary>
/// 删除文件夹
/// </summary>
/// <param name="dirName">文件夹名称</param>
/// <returns>返回一个值,指示是否删除成功</returns>
public bool DeleteDirectory(string dirName)
{
bool result = false;
//建立连接
string url = Host.TrimEnd('/') + RemotePath + dirName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.RemoveDirectory);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = true;
}
return result;
}
#endregion #region 从FTP服务器上获取文件大小
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public long GetFileSize(string fileName)
{
long result = 0;
//建立连接
string url = Host.TrimEnd('/') + RemotePath + fileName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.GetFileSize);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = response.ContentLength;
} return result;
}
#endregion #region 给FTP服务器上的文件追加内容
/// <summary>
/// 给FTP服务器上的文件追加内容
/// </summary>
/// <param name="localFile">本地文件</param>
/// <param name="remoteFileName">FTP服务器上的文件</param>
/// <returns>返回一个值,指示是否追加成功</returns>
public bool Append(FileInfo localFile, string remoteFileName)
{
if (localFile.Exists)
{
using (FileStream fs = new FileStream(localFile.FullName, FileMode.Open))
{
return Append(fs, remoteFileName);
}
}
throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
} /// <summary>
/// 给FTP服务器上的文件追加内容
/// </summary>
/// <param name="stream">数据流(可通过设置偏移来实现从特定位置开始上传)</param>
/// <param name="remoteFileName">FTP服务器上的文件</param>
/// <returns>返回一个值,指示是否追加成功</returns>
public bool Append(Stream stream, string remoteFileName)
{
bool result = false;
if (stream != null && stream.CanRead)
{
//建立连接
string url = Host.TrimEnd('/') + RemotePath + remoteFileName;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.AppendFile);
using (Stream rs = request.GetRequestStream())
{
//上传数据
byte[] buffer = new byte[4096];//4K
int count = stream.Read(buffer, 0, buffer.Length);
while (count > 0)
{
rs.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffer.Length);
}
result = true;
}
}
return result;
}
#endregion #region 获取FTP服务器上的当前路径
/// <summary>
/// 获取FTP服务器上的当前路径
/// </summary>
public string CurrentDirectory
{
get
{
string result = string.Empty;
string url = Host.TrimEnd('/') + RemotePath;
FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.PrintWorkingDirectory);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
string temp = response.StatusDescription;
int start = temp.IndexOf('"') + 1;
int end = temp.LastIndexOf('"');
if (end >= start)
{
result = temp.Substring(start, end - start);
}
}
return result; }
}
#endregion #region 检查当前路径上是否存在某个文件
/// <summary>
/// 检查文件是否存在
/// </summary>
/// <param name="fileName">要检查的文件名</param>
/// <returns>返回一个值,指示要检查的文件是否存在</returns>
public bool CheckFileExist(string fileName)
{
bool result = false;
if (fileName != null && fileName.Trim().Length > 0)
{
fileName = fileName.Trim();
List<string> files = GetFileList();
if (files != null && files.Count > 0)
{
foreach (string file in files)
{
if (file.ToLower() == fileName.ToLower())
{
result = true;
break;
}
}
}
}
return result;
}
#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. php的FTP操作类

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

  4. 很实用的FTP操作类

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

  5. FTP操作类的使用

    FTP(文件传输协议) FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序 ...

  6. (转)FTP操作类,从FTP下载文件

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

  7. FTP操作类(支持异步)

    public delegate void DownloadProgressChangedEventHandle(string information, long currentprogress, lo ...

  8. c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类

    有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...

  9. [转]C# FTP操作类

      转自 http://www.cnblogs.com/Liyuting/p/7084718.html using System; using System.Collections.Generic; ...

随机推荐

  1. java io读书笔记(7) Closing Output Streams

    输出完毕后,需要close这个stream,从而使操作系统释放相关的资源.举例: public void close( ) throws IOException 并不是所有的stream都需要clos ...

  2. HTML_css样式表 样式属性 格式布局

    CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确, ...

  3. UVa10025-The ? 1 ? 2 ? ... ? n = k problem

    分析:因为数字之间只有加减变换,所以-k和k是一样的,都可以当成整数来考虑,只要找到最小的n满足sum=n*(n+1)/2>=k:且sum和k同奇同偶即可,做法是用二分查找,然后在就近查找 因为 ...

  4. poj 1417(并查集+简单dp)

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2087   Accepted: 640 Descrip ...

  5. csuoj 1334: 好老师

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1334 1334: 好老师 Time Limit: 1 Sec  Memory Limit: 128 ...

  6. Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用)

    package lsg.ap.april4th2; /* 知识点:1.Getter and Setter 的应用 2.局部变量与成员变量(也可叫做全局变量) 3.Static关键字的用法 a.成员变量 ...

  7. Andriod环境搭建

    安卓是一款现在在移动端十分流行的系统,本人出于好奇心,希望彻底了解安卓的开发技. 首先了解一下安卓的系统构架,安卓大致分为四层架构,五块区域: 1.Linux内核层 Andriod是基于Linux2. ...

  8. JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面

    将Set集合对象转换为JSon格式的对象字符串,返回给界面 需要导入的jar包: 编写:servlet: package com.west.webcourse.servlet; import java ...

  9. 玩转HTML5移动页面(动效篇)(转载)

    本文转载自: 玩转HTML5移动页面(动效篇)

  10. js 获取选中的多选框

    前台html <span class="spbox"> <input type="checkbox" name="category& ...