C#的FTP服务器源代码
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服务器源代码的更多相关文章
- [CentOs7]搭建ftp服务器
摘要 vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux. ...
- 获取小众ftp服务器指定目录内容列表
今天获取小众ftp服务器指定目录内容列表时费劲急了. ///parama url="ftp://x.x.x.x/dir_name" public string GetFTPDir( ...
- 搭建windows下filezilla FTP服务器
FTP服务器必不可少,鉴于serv-u越来越冗余繁多的设置,个人还是比较喜欢简单.干净,满足需求即可的东东,所以选择filezilla.更主要的原因是ta是开元免费使用的,虽然免费,功能却齐全,我发现 ...
- Pureftp-安全的ftp服务器部署
一.简介: Pure-FTPd 是一款免费(BSD)的,安全的,高质量和符合标准的FTP服务器. 侧重于运行效率和易用性. 它提供了简单的答案,他满足了大众化的需求,包括普通用户以及主机供应商们 Pu ...
- Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍
本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...
- 【转】ubuntu下安装及设置FTP服务器!!
原文网址:http://hujizhou.blog.51cto.com/514907/1290915 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...
- linux上搭建ftp服务器
摘要 vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行 ...
- Centos7安装搭建FTP服务器(最简便方法)
简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linu ...
- ftp服务器搭建(windows)+实现ftp图片上传对接
ftp服务器搭建(windows): vsftpd简介: vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的.开放源代码的ftp服务器软件. 下载地址: http: ...
随机推荐
- 题解 yzoj1663: 愤怒的牛(二分) yzoj1662: 曲线(三分)
话说二分和三分的题还没有整理过,就趁这两题来整理下笔记 先讲讲关于二分,对于二分的具体边界长期以来对我来说都是个玄学问题,都是边调边拍改对的.思路大体是确定左边界l,和有边界r,判断满足条件缩小范围. ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...
- 如何完美激活pycharm2019.2.2
本号持续关注pycharm的更新,这不本月11号迎来新版本,为防走丢,请关注公众号,让我们携手并行!有道是"予人玫瑰手留余香",分享的确是件令人愉快的事,这也是我创建公众号的初心. ...
- vue-cli3.0 Typescript 项目集成环信WebIM 群组聊天
项目背景 环信webim 官方没有vue版本的,自己就根据sdk重写了个vue版本的,只实现了基础的 登录 群组功能,其他的可以根据需要参考官方文档,添加相应的功能. 环信webim SDK相关文档: ...
- Linux下Mysql启动异常排查方案
遇到Mysql启动异常问题,可以从以下几个方面依次进行问题排查: (1)如果遇到“Can't connect to local MySQL server through socket '/tmp/my ...
- Winform中使用FastReport实现自定义PDF打印预览
场景 Winform中使用FastReport实现简单的自定义PDF导出: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1009 ...
- C++性能查看-宏定义输出
之前由于想统计代码中每个模块加载时长,因此写了一个模块加载时长统计类,使用起来也是超级方便,只需要定义一个宏即可 使用方式如下: 1.统计函数性能 void func() { CONSUMING_OU ...
- idea使用Deployment部署项目到阿里云服务器的全过程
一.前言 之前玩了一下 Alibaba Cloud Toolkit 一键部署插件 这里顺便再提一下idea原生的Deployment自动部署项目吧,该功能也很强大,也不需要离开idea就可以直接将项目 ...
- nginx主配置参数详解
########Nginx的main(全局配置)文件 #指定nginx运行的用户及用户组,默认为nobody #user nobody; #开启的线程数,一般跟逻辑CPU核数一致 worker_pro ...
- js控制滚动条在内容更新超出时自动滚到底部
//滚动条在内容更新时自动滚到底部var message = document.getElementById('message');message.scrollTop = message.scroll ...