edtFTPnet官方网站:
http://www.enterprisedt.com/products/edtftpnet/

目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll,在项目中添加引用。
下面为一些用法:

1、FTP服务器根目录为web,在它下面创建如下图示的目录和上传文件
FTPConnection.CommandEncoding = Encoding.GetEncoding("GBK") 指定GBK编码以支持中文文件名
FTPConnection.CreateDirectory() 创建指定目录
FTPConnection.ChangeWorkingDirectory() 切换到指定目录
FTPConnection.UploadFile() 上传文件

web
|-----L11
      |-----L21            
            |-----L31
                  |-----31.htm
            |-----21.htm
      |-----L22
      |-----11.htm
      |-----目录.txt

private const string ftpServerIP = "xx.xx.xx.xx";
private const string ftpRemotePath = "web";
private const string ftpUserID = "user";
private const string ftpPassword = "123"; private void btnCreateAndUpload_Click(object sender, EventArgs e)
{
using (var conn = new FTPConnection
{
ServerAddress = ftpServerIP,
ServerDirectory = ftpRemotePath,
UserName = ftpUserID,
Password = ftpPassword,
CommandEncoding = Encoding.GetEncoding("GBK")
})
{
conn.Connect(); //创建目录L11
conn.CreateDirectory("L11"); //============切换当前工作目录到L11============
conn.ChangeWorkingDirectory("L11");
//上行代码也可以用conn.ServerDirectory = "L11"; //上传"文档.txt"
conn.UploadFile("文档.txt", "文档.txt"); //创建子目录L21,L22
conn.CreateDirectory("L21");
conn.CreateDirectory("L22"); //在当前工作目录L11上传文件"L11.htm"
conn.UploadFile("11.htm", "11.htm"); //============切换当前工作目录到L21============
conn.ChangeWorkingDirectory("L21"); //上传文件21.htm
conn.UploadFile("21.htm", "21.htm");
//创建目录L31
conn.CreateDirectory("L31"); //============切换当前工作目录到L31============
conn.ChangeWorkingDirectory("L31"); //上传文件31.htm
conn.UploadFile("31.htm", "31.htm");
}
}

2、获取文件信息
FTPConnection.GetFileInfos() 获取文件和目录详细信息,结果的一个属性Dir为true表示为目录,否则为文件

private void btnList_Click(object sender, EventArgs e)
{
using (var conn = new FTPConnection
{
ServerAddress = ftpServerIP,
ServerDirectory = ftpRemotePath,
UserName = ftpUserID,
Password = ftpPassword,
CommandEncoding = Encoding.GetEncoding("GBK")
})
{
conn.Connect();
//获取指定目录的所有子目录和文件信息
conn.ChangeWorkingDirectory("L11/L21");
var files1 = conn.GetFileInfos();
ShowFileInfos(files1);
/*结果如下:
File, /web/L11/L21/21.htm, 21.htm, 11.2KB, 2013-9-26 14:51:00
Dir, /web/L11/L21/L31, L31, 0KB, 2013-9-26 14:51:00
*/ ////返回上级目录,例子中为web/L11
conn.ChangeWorkingDirectoryUp();
var files2 = conn.GetFileInfosRecursive();
ShowFileInfos(files2);
/*结果如下:
File, /web/L11/11.htm, 11.htm, 59.4KB, 2013-9-26 14:51:00
Dir, /web/L11/L21, L21, 0KB, 2013-9-26 14:51:00
Dir, /web/L11/L22, L22, 0KB, 2013-9-26 14:51:00
File, /web/L11/文档.txt, 文档.txt, 40.8KB, 2013-9-26 14:51:00
File, /web/L11/L21/21.htm, 21.htm, 11.2KB, 2013-9-26 14:51:00
Dir, /web/L11/L21/L31, L31, 0KB, 2013-9-26 14:51:00
File, /web/L11/L21/L31/31.htm, 31.htm, 5.6KB, 2013-9-26 14:51:00
*/
}
}
void ShowFileInfos(FTPFile[] files)
{
foreach (var file in files)
{
string info = string.Format("{0}, {1}, {2}, {3}KB, {4}",
file.Dir ? "Dir" : "File", file.Path, file.Name, Math.Round(file.Size / 1024.0, 1), file.LastModified);
richTextBox1.AppendText(info + "\r\n");
}
richTextBox1.AppendText("\r\n");
}

其中递归获取指定目录的所有子目录和文件信息的扩展方法GetFileInfosRecursive如下:

public static class FtpClientExtensions
{
/// <summary>
/// 递归获取目录的所有子目录和文件信息
/// </summary>
public static FTPFile[] GetFileInfosRecursive(this FTPConnection conn)
{
var resultList = new List<FTPFile>();
var fileInfos = conn.GetFileInfos();
resultList.AddRange(fileInfos);
foreach (var fileInfo in fileInfos)
{
if (fileInfo.Dir)
{
conn.ServerDirectory = fileInfo.Path;
resultList.AddRange(conn.GetFileInfosRecursive());
}
}
return resultList.ToArray();
}
/// <summary>
/// 递归删除目录(包括所有子目录和文件信息)
/// </summary>
public static void DeleteDirectoryRecursive(this FTPConnection conn, string directoryName)
{
conn.ChangeWorkingDirectory(directoryName);
var fileInfos = conn.GetFileInfos();
foreach (var fileInfo in fileInfos)
{
if (fileInfo.Dir)
conn.DeleteDirectoryRecursive(fileInfo.Name);
else
conn.DeleteFile(fileInfo.Name);
}
conn.ChangeWorkingDirectoryUp();
conn.DeleteDirectory(directoryName);
}
}

3、删除目录及所有子目录和文件
FTPConnection.DeleteDirectory()当删除的目录不为空时,会出错,需递归删除,
递归删除目录扩展方法DeleteDirectoryRecursive见上面类FtpClientExtensions

private void btnDelete_Click(object sender, EventArgs e)
{
using (var conn = new FTPConnection
{
ServerAddress = ftpServerIP,
ServerDirectory = ftpRemotePath,
UserName = ftpUserID,
Password = ftpPassword,
CommandEncoding = Encoding.GetEncoding("GBK")
})
{
conn.Connect();
//递归删除目录及所有子目录和文件
conn.DeleteDirectoryRecursive("L11");
//如果删除单个文件,路径为当前目录的相对路径
//conn.DeleteFile("L11/11.htm");
}
}

开源.NET FTP组件edtFTPnet 用法的更多相关文章

  1. .net 开源 FTP 组件 edtFTPnet

    edtFTPnet官方网站:http://www.enterprisedt.com/products/edtftpnet/ 目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll ...

  2. log4net--不可多得的开源日志记录组件

    log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...

  3. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  4. 突破自我,开源NetWorkSocket通讯组件

    前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经过一些时间的思考,决定将NetworkSoc ...

  5. Win7下的内置FTP组件的设置详解

    在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FTP组件.故FTP的设置第一步就是安装F ...

  6. 【转】免费开源的FTP软件,FileZilla

    原文网址:http://baike.baidu.com/view/670329.htm?fr=aladdin FileZilla FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版 ...

  7. 开源word操作组件DocX的记录

    开源word操作组件DocX的记录 使用开源word操作组件DocX的记录 1.DocX简介 1.1 简介 DocX是一个在不需要安装word的情况下对word进行操作的开源轻量级.net组件,是由爱 ...

  8. 使用开源word操作组件DocX的记录

    1.DocX简介 1.1 简介 DocX是一个在不需要安装word的情况下对word进行操作的开源轻量级.net组件,是由爱尔兰的一个叫Cathal Coffey的博士生开发出来的.DocX使得操作w ...

  9. 开源NetWorkSocket通讯组件

    开源NetWorkSocket通讯组件   前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...

随机推荐

  1. jquery ajax 对异步队列defer与XMLHttprequest.onload的依赖

    ajax 对异步队列defer与XMLHttprequest.onload的依赖

  2. node js 模块分类

    核心模块 require('fs'); 核心模块是被编译成二进制代码 文件模块 require('../fs.js'); 对于加载模块时既没指出./ ../ /.../时,加载模块的搜索路径.如果'/ ...

  3. mybatis底层源码分析之--配置文件读取和解析

    现在企业级开发中ssm是很常见的技术标配,mybatis比hibernate轻量了很多,而且学习成本相对较低,简单易上手. 那么,问题来了,简单好用的mybatis底层到底是如何实现的呢?都使用了什么 ...

  4. eclipse工程加入jquery.min.js报错:missing semicolon

    1,注释修改项目目录下的.project文件 <?xml version="1.0" encoding="UTF-8"?> <projectD ...

  5. nginx服务器状态监控

    Nginx开启监控需在编译时加入with-http_stub_status_module,查看当前Nginx编译参数:/usr/local/nginx/sbin/nginx -V 1.以二级目录方式开 ...

  6. Codevs 3287 货车运输

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  7. android MotionEvent获得当前位置

    event.getY()与event.getX()为当前触摸位置距离当前元素顶端和左端的距离: event.getRowY()与event.getRowX()为当前触摸位置距离当前屏幕顶端和左端的距离 ...

  8. spring 连接各种数据源的配置(转载)

    在 开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数 ...

  9. oracle创建、删除账户

    1.创建 /*第1步:创建表空间 */create tablespace xybi datafile 'E:\oracle\oradata\zzxe\xybi_d01' size 100M ; /*第 ...

  10. Java并发控制:ReentrantLock Condition使用详解

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另外一个 ...