using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

//**new namespace

using System.Net;

using System.Net.Sockets;

using System.IO;

using System.Resources;

using System.Text.RegularExpressions;

using System.Collections;

namespace crFTP

{

///

/// FTP类

///

public class FTP

{

#region 变量声明

///

/// 服务器连接地址

///

public string server;

///

/// 登陆帐号

///

public string user;

///

/// 登陆口令

///

public string pass;

///

/// 端口号

///

public int port;

///

/// 无响应时间(FTP在指定时间内无响应)

///

public int timeout;

///

/// 服务器错误状态信息

///

public string errormessage;

///

/// 服务器状态返回信息

///

private string messages;

///

/// 服务器的响应信息

///

private string responseStr;

///

/// 链接模式(主动或被动,默认为被动)

///

private bool passive_mode;

///

/// 上传或下载信息字节数

///

private long bytes_total;

///

/// 上传或下载的文件大小

///

private long file_size;

///

/// 主套接字

///

private Socket main_sock;

///

/// 要链接的网络地址终结点

///

private IPEndPoint main_ipEndPoint;

///

/// 侦听套接字

///

private Socket listening_sock;

///

/// 数据套接字

///

private Socket data_sock;

///

/// 要链接的网络数据地址终结点

///

private IPEndPoint data_ipEndPoint;

///

/// 用于上传或下载的文件流对象

///

private FileStream file;

///

/// 与FTP服务器交互的状态值

///

private int response;

///

/// 读取并保存当前命令执行后从FTP服务器端返回的数据信息

///

private string bucket;

#endregion

#region 构造函数

///

/// 构造函数

///

public FTP()

{

server = null;

user = null;

pass = null;

port = 21;

passive_mode = true;

main_sock = null;

main_ipEndPoint = null;

listening_sock = null;

data_sock = null;

data_ipEndPoint = null;

file = null;

bucket = "";

bytes_total = 0;

timeout = 10000; //无响应时间为10秒

messages = "";

errormessage = "";

}

///

/// 构造函数

///

/// 服务器IP或名称

/// 登陆帐号

/// 登陆口令

public FTP(string server, string user, string pass)

{

this.server = server;

this.user = user;

this.pass = pass;

port = 21;

passive_mode = true;

main_sock = null;

main_ipEndPoint = null;

listening_sock = null;

data_sock = null;

data_ipEndPoint = null;

file = null;

bucket = "";

bytes_total = 0;

timeout = 10000; //无响应时间为10秒

messages = "";

errormessage = "";

}

///

/// 构造函数

///

/// 服务器IP或名称

/// 端口号

/// 登陆帐号

/// 登陆口令

public FTP(string server, int port, string user, string pass)

{

this.server = server;

this.user = user;

this.pass = pass;

this.port = port;

passive_mode = true;

main_sock = null;

main_ipEndPoint = null;

listening_sock = null;

data_sock = null;

data_ipEndPoint = null;

file = null;

bucket = "";

bytes_total = 0;

timeout = 10000; //无响应时间为10秒

messages = "";

errormessage = "";

}

///

/// 构造函数

///

/// 服务器IP或名称

/// 端口号

/// 登陆帐号

/// 登陆口令

/// 链接方式

public FTP(string server, int port, string user, string pass, int mode)

{

this.server = server;

this.user = user;

this.pass = pass;

this.port = port;

passive_mode = mode

/// 构造函数

///

/// 服务器IP或名称

/// 端口号

/// 登陆帐号

/// 登陆口令

/// 链接方式

/// 无响应时间(限时),单位:秒 (小于或等于0为不受时间限制)

public FTP(string server, int port, string user, string pass, int mode, int timeout_sec)

{

this.server = server;

this.user = user;

this.pass = pass;

this.port = port;

passive_mode = mode

/// 当前是否已连接

///

public bool IsConnected

{

get

{

if (main_sock != null)

return main_sock.Connected;

return false;

}

}

///

/// 当message缓冲区有数据则返回

///

public bool MessagesAvailable

{

get

{

if (messages.Length > 0)

return true;

return false;

}

}

///

/// 获取服务器状态返回信息, 并清空messages变量

///

public string Messages

{

get

{

string tmp = messages;

messages = "";

return tmp;

}

}

///

/// 最新指令发出后服务器的响应

///

public string ResponseString

{

get

{

return responseStr;

}

}

///

///在一次传输中,发送或接收的字节数

///

public long BytesTotal

{

get

{

return bytes_total;

}

}

///

///被下载或上传的文件大小,当文件大小无效时为0

///

public long FileSize

{

get

{

return file_size;

}

}

///

/// 链接模式:

/// true 被动模式 [默认]

/// false: 主动模式

///

public bool PassiveMode

{

get

{

return passive_mode;

}

set

{

passive_mode = value;

}

}

#endregion

#region 操作

///

/// 操作失败

///

private void Fail()

{

Disconnect();

errormessage += responseStr;

//throw new Exception(responseStr);

}

///

/// 下载文件类型

///

/// true:二进制文件 false:字符文件

private void SetBinaryMode(bool mode)

{

if (mode)

SendCommand("TYPE I");

else

SendCommand("TYPE A");

ReadResponse();

if (response != 200)

Fail();

}

///

/// 发送命令

///

///

private void SendCommand(string command)

{

Byte[] cmd = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());

if (command.Length > 3 && command.Substring(0, 4) == "PASS")

{

messages = "\rPASS xxx";

}

else

{

messages = "\r" + command;

}

try

{

main_sock.Send(cmd, cmd.Length, 0);

}

catch (Exception ex)

{

try

{

Disconnect();

errormessage += ex.Message;

return;

}

catch

{

main_sock.Close();

file.Close();

main_sock = null;

main_ipEndPoint = null;

file = null;

}

}

}

private void FillBucket()

{

Byte[] bytes = new Byte[512];

long bytesgot;

int msecs_passed = 0;

while (main_sock.Available timeout)

{

Disconnect();

errormessage += "Timed out waiting on server to respond.";

return;

}

}

while (main_sock.Available > 0)

{

bytesgot = main_sock.Receive(bytes, 512, 0);

bucket += Encoding.ASCII.GetString(bytes, 0, (int)bytesgot);

System.Threading.Thread.Sleep(50);

}

}

private string GetLineFromBucket()

{

int i;

string buf = "";

if ((i = bucket.IndexOf('\n'))

/// 返回服务器端返回信息

///

private void ReadResponse()

{

string buf;

messages = "";

while (true)

{

buf = GetLineFromBucket();

if (Regex.Match(buf, "^[0-9]+ ").Success)

{

responseStr = buf;

response = int.Parse(buf.Substring(0, 3));

break;

}

else

messages += Regex.Replace(buf, "^[0-9]+-", "") + "\n";

}

}

///

/// 打开数据套接字

///

private void OpenDataSocket()

{

if (passive_mode)

{

string[] pasv;

string server;

int port;

Connect();

SendCommand("PASV");

ReadResponse();

if (response != 227)

Fail();

try

{

int i1, i2;

i1 = responseStr.IndexOf('(') + 1;

i2 = responseStr.IndexOf(')') - i1;

pasv = responseStr.Substring(i1, i2).Split(',');

}

catch (Exception)

{

Disconnect();

errormessage += "Malformed PASV response: " + responseStr;

return;

}

if (pasv.Length

/// 关闭所有链接

///

public void Disconnect()

{

CloseDataSocket();

if (main_sock != null)

{

if (main_sock.Connected)

{

SendCommand("QUIT");

main_sock.Close();

}

main_sock = null;

}

if (file != null)

file.Close();

main_ipEndPoint = null;

file = null;

}

///

/// 链接到FTP服务器

///

/// 要链接的IP地址或主机名

/// 端口号

/// 登陆帐号

/// 登陆口令

public void Connect(string server, int port, string user, string pass)

{

this.server = server;

this.user = user;

this.pass = pass;

this.port = port;

Connect();

}

///

/// 链接到FTP服务器

///

/// 要链接的IP地址或主机名

/// 登陆帐号

/// 登陆口令

public void Connect(string server, string user, string pass)

{

this.server = server;

this.user = user;

this.pass = pass;

Connect();

}

///

/// 链接到FTP服务器

///

public bool Connect()

{

if (server == null)

{

errormessage += "No server has been set.\r\n";

}

if (user == null)

{

errormessage += "No server has been set.\r\n";

}

if (main_sock != null)

if (main_sock.Connected)

return true;

try

{

main_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//#if NET1

main_ipEndPoint = new IPEndPoint(Dns.GetHostByName(server).AddressList[0], port);

//#else

// main_ipEndPoint = new IPEndPoint(System.Net.Dns.GetHostEntry(server).AddressList[0], port);

//#endif

main_sock.Connect(main_ipEndPoint);

}

catch (Exception ex)

{

errormessage += ex.Message;

return false;

}

ReadResponse();

if (response != 220)

Fail();

SendCommand("USER " + user);

ReadResponse();

switch (response)

{

case 331:

if (pass == null)

{

Disconnect();

errormessage += "No password has been set.";

return false;

}

SendCommand("PASS " + pass);

ReadResponse();

if (response != 230)

{

Fail();

return false;

}

break;

case 230:

break;

}

return true;

}

///

/// 获取FTP当前(工作)目录下的文件列表

///

/// 返回文件列表数组

public ArrayList List()

{

Byte[] bytes = new Byte[512];

string file_list = "";

long bytesgot = 0;

int msecs_passed = 0;

ArrayList list = new ArrayList();

Connect();

OpenDataSocket();

SendCommand("LIST");

ReadResponse();

switch (response)

{

case 125:

case 150:

break;

default:

CloseDataSocket();

throw new Exception(responseStr);

}

ConnectDataSocket();

while (data_sock.Available (timeout / 10))

{

break;

}

}

while (data_sock.Available > 0)

{

bytesgot = data_sock.Receive(bytes, bytes.Length, 0);

file_list += Encoding.ASCII.GetString(bytes, 0, (int)bytesgot);

System.Threading.Thread.Sleep(50);

}

CloseDataSocket();

ReadResponse();

if (response != 226)

throw new Exception(responseStr);

foreach (string f in file_list.Split('\n'))

{

if (f.Length > 0 && !Regex.Match(f, "^total").Success)

list.Add(f.Substring(0, f.Length - 1));

}

return list;

}

///

/// 获取到文件名列表

///

/// 返回文件名列表

public ArrayList ListFiles()

{

ArrayList list = new ArrayList();

foreach (string f in List())

{

if ((f.Length > 0))

{

if ((f[0] != 'd') && (f.ToUpper().IndexOf("")

/// 获取路径列表

///

/// 返回路径列表

public ArrayList ListDirectories()

{

ArrayList list = new ArrayList();

foreach (string f in List())

{

if (f.Length > 0)

{

if ((f[0] == 'd') || (f.ToUpper().IndexOf("") >= 0))

list.Add(f);

}

}

return list;

}

///

/// 获取原始数据信息.

///

/// 远程文件名

/// 返回原始数据信息.

public string GetFileDateRaw(string fileName)

{

Connect();

SendCommand("MDTM " + fileName);

ReadResponse();

if (response != 213)

{

errormessage += responseStr;

return "";

}

return (this.responseStr.Substring(4));

}

///

/// 得到文件日期.

///

/// 远程文件名

/// 返回远程文件日期

public DateTime GetFileDate(string fileName)

{

return ConvertFTPDateToDateTime(GetFileDateRaw(fileName));

}

private DateTime ConvertFTPDateToDateTime(string input)

{

if (input.Length

/// 获取FTP上的当前(工作)路径

///

/// 返回FTP上的当前(工作)路径

public string GetWorkingDirectory()

{

//PWD - 显示工作路径

Connect();

SendCommand("PWD");

ReadResponse();

if (response != 257)

{

errormessage += responseStr;

}

string pwd;

try

{

pwd = responseStr.Substring(responseStr.IndexOf("\"", 0) + 1);//5);

pwd = pwd.Substring(0, pwd.LastIndexOf("\""));

pwd = pwd.Replace("\"\"", "\""); // 替换带引号的路径信息符号

}

catch (Exception ex)

{

errormessage += ex.Message;

return null;

}

return pwd;

}

///

/// 跳转服务器上的当前(工作)路径

///

/// 要跳转的路径

public bool ChangeDir(string path)

{

Connect();

SendCommand("CWD " + path);

ReadResponse();

if (response != 250)

{

errormessage += responseStr;

return false;

}

return true;

}

///

/// 创建指定的目录

///

/// 要创建的目录

public void MakeDir(string dir)

{

Connect();

SendCommand("MKD " + dir);

ReadResponse();

switch (response)

{

case 257:

case 250:

break;

default:

{

errormessage += responseStr;

break;

}

}

}

///

/// 移除FTP上的指定目录

///

/// 要移除的目录

public void RemoveDir(string dir)

{

Connect();

SendCommand("RMD " + dir);

ReadResponse();

if (response != 250)

{

errormessage += responseStr;

return;

;

}

}

///

/// 移除FTP上的指定文件

///

/// 要移除的文件名称

public void RemoveFile(string filename)

{

Connect();

SendCommand("DELE " + filename);

ReadResponse();

if (response != 250)

{

errormessage += responseStr;

}

}

///

/// 重命名FTP上的文件

///

/// 原文件名

/// 新文件名

public void RenameFile(string oldfilename, string newfilename)

{

Connect();

SendCommand("RNFR " + oldfilename);

ReadResponse();

if (response != 350)

{

errormessage += responseStr;

}

else

{

SendCommand("RNTO " + newfilename);

ReadResponse();

if (response != 250)

{

errormessage += responseStr;

}

}

}

///

/// 获得指定文件的大小(如果FTP支持)

///

/// 指定的文件

/// 返回指定文件的大小

public long GetFileSize(string filename)

{

Connect();

SendCommand("SIZE " + filename);

ReadResponse();

if (response != 213)

{

errormessage += responseStr;

}

return Int64.Parse(responseStr.Substring(4));

}

///

/// 上传指定的文件

///

/// 要上传的文件

public bool OpenUpload(string filename)

{

return OpenUpload(filename, filename, false);

}

///

/// 上传指定的文件

///

/// 本地文件名

/// 远程要覆盖的文件名

public bool OpenUpload(string filename, string remotefilename)

{

return OpenUpload(filename, remotefilename, false);

}

///

/// 上传指定的文件

///

/// 本地文件名

/// 如果存在,则尝试恢复

public bool OpenUpload(string filename, bool resume)

{

return OpenUpload(filename, filename, resume);

}

///

/// 上传指定的文件

///

/// 本地文件名

/// 远程要覆盖的文件名

/// 如果存在,则尝试恢复

public bool OpenUpload(string filename, string remote_filename, bool resume)

{

Connect();

SetBinaryMode(true);

OpenDataSocket();

bytes_total = 0;

try

{

file = new FileStream(filename, FileMode.Open);

}

catch (Exception ex)

{

file = null;

errormessage += ex.Message;

return false;

}

file_size = file.Length;

if (resume)

{

long size = GetFileSize(remote_filename);

SendCommand("REST " + size);

ReadResponse();

if (response == 350)

file.Seek(size, SeekOrigin.Begin);

}

SendCommand("STOR " + remote_filename);

ReadResponse();

switch (response)

{

case 125:

case 150:

break;

default:

file.Close();

file = null;

errormessage += responseStr;

return false;

}

ConnectDataSocket();

return true;

}

///

/// 下载指定文件

///

/// 远程文件名称

public void OpenDownload(string filename)

{

OpenDownload(filename, filename, false);

}

///

/// 下载并恢复指定文件

///

/// 远程文件名称

/// 如文件存在,则尝试恢复

public void OpenDownload(string filename, bool resume)

{

OpenDownload(filename, filename, resume);

}

///

/// 下载指定文件

///

/// 远程文件名称

/// 本地文件名

public void OpenDownload(string remote_filename, string localfilename)

{

OpenDownload(remote_filename, localfilename, false);

}

///

/// 打开并下载文件

///

/// 远程文件名称

/// 本地文件名

/// 如果文件存在则恢复

public void OpenDownload(string remote_filename, string local_filename, bool resume)

{

Connect();

SetBinaryMode(true);

bytes_total = 0;

try

{

file_size = GetFileSize(remote_filename);

}

catch

{

file_size = 0;

}

if (resume && File.Exists(local_filename))

{

try

{

file = new FileStream(local_filename, FileMode.Open);

}

catch (Exception ex)

{

file = null;

throw new Exception(ex.Message);

}

SendCommand("REST " + file.Length);

ReadResponse();

if (response != 350)

throw new Exception(responseStr);

file.Seek(file.Length, SeekOrigin.Begin);

bytes_total = file.Length;

}

else

{

try

{

file = new FileStream(local_filename, FileMode.Create);

}

catch (Exception ex)

{

file = null;

throw new Exception(ex.Message);

}

}

OpenDataSocket();

SendCommand("RETR " + remote_filename);

ReadResponse();

switch (response)

{

case 125:

case 150:

break;

default:

file.Close();

file = null;

errormessage += responseStr;

return;

}

ConnectDataSocket();

return;

}

///

/// 上传文件(循环调用直到上传完毕)

///

/// 发送的字节数

public long DoUpload()

{

Byte[] bytes = new Byte[512];

long bytes_got;

try

{

bytes_got = file.Read(bytes, 0, bytes.Length);

bytes_total += bytes_got;

data_sock.Send(bytes, (int)bytes_got, 0);

if (bytes_got

/// 下载文件(循环调用直到下载完毕)

///

/// 接收到的字节点

public long DoDownload()

{

Byte[] bytes = new Byte[512];

long bytes_got;

try

{

bytes_got = data_sock.Receive(bytes, bytes.Length, 0);

if (bytes_got

C#的FTP服务器源代码的更多相关文章

  1. [CentOs7]搭建ftp服务器

    摘要 vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux. ...

  2. 获取小众ftp服务器指定目录内容列表

    今天获取小众ftp服务器指定目录内容列表时费劲急了. ///parama url="ftp://x.x.x.x/dir_name" public string GetFTPDir( ...

  3. 搭建windows下filezilla FTP服务器

    FTP服务器必不可少,鉴于serv-u越来越冗余繁多的设置,个人还是比较喜欢简单.干净,满足需求即可的东东,所以选择filezilla.更主要的原因是ta是开元免费使用的,虽然免费,功能却齐全,我发现 ...

  4. Pureftp-安全的ftp服务器部署

    一.简介: Pure-FTPd 是一款免费(BSD)的,安全的,高质量和符合标准的FTP服务器. 侧重于运行效率和易用性. 它提供了简单的答案,他满足了大众化的需求,包括普通用户以及主机供应商们 Pu ...

  5. Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

    本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...

  6. 【转】ubuntu下安装及设置FTP服务器!!

    原文网址:http://hujizhou.blog.51cto.com/514907/1290915 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...

  7. linux上搭建ftp服务器

    摘要 vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行 ...

  8. Centos7安装搭建FTP服务器(最简便方法)

    简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linu ...

  9. ftp服务器搭建(windows)+实现ftp图片上传对接

    ftp服务器搭建(windows): vsftpd简介: vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的.开放源代码的ftp服务器软件. 下载地址: http: ...

随机推荐

  1. 10 UA池和代理池

    在Scrapy中,引擎和下载器之间有一个组件,叫下载中间件(Downloader Middlewares).因它是介于Scrapy的request/response处理的钩子,所以有2方面作用: (1 ...

  2. WordCount--统计输入文件的字符数、行数、单词数(java)--初级功能

    码云地址: https://gitee.com/YuRenDaZ/WordCount 个人PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 180 ...

  3. 【Distributed】缓存技术

    一.缓存概述 1.1 缓存技术分类 1.2 缓存框架分类 1.3 Session理解的误区 二.基于Map集合实现本地缓存 2.1 定义Map缓存工具类 2.2 使用案例 三.Ehcache 缓存框架 ...

  4. 聊聊Spring Cloud Config

    Spring Cloud Config 转自:https://blog.csdn.net/fjnpysh/article/details/71307311 现今这个时候,微服务大行其道,互联网应用遍地 ...

  5. Hive数据导入/导出

    1.1 导入/导出规则 EXPORT 命令导出数据表或分区,与元数据一起输出到指定位置.又可以从这个输出位置移动到不同的Hadoop 或Hive 实例中,并且使用IMPORT 命令导入. 当导出一个分 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. Day 18 软件管理3之搭建网络仓库

    搭建一个网络仓库 服务端: 10.0.0.200   1.准备软件包( 1.光盘 2.缓存 3.联网下载 4.同步 ) 2.通过p共享软件包存放的目录 3.将光盘中的软件包都拷贝至p的共享目录下 4. ...

  8. linux语句速查

    一.netstat -a或--all:显示所有连线中的Socket -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址 -c或--continuous:持续列出 ...

  9. [Full-stack] 一切皆在云上 - AWS

    一元课程:https://edu.51cto.com/center/course/lesson/index?id=181407[非常好] Based on AWS Lambda. 包含:DevOps ...

  10. 利用ShowDoc自动生成api接口文档

    最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...