客户端代码:
using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;namespace FtpClient
{
public partial class FormMain : Form
{
private const int ftpPort = 21; //控制连接服务器端口
private string ftpUriString; //要访问的资源
private NetworkCredential networkCredential; //身份验证信息
private string currentDir = "/"; //客户端当前工作目录
public FormMain()
{
InitializeComponent();
//为简单起见,此处假设服务器配置在本机,并假定了有效用户名和密码
//IPAddress[] ips = Dns.GetHostAddresses("");
//textBoxServer.Text = ips[0].ToString();
//textBoxUserName.Text = "mytestName";
//textBoxPassword.Text = "12345";
}
/// <summary>登录</summary>
private void buttonLogin_Click(object sender, EventArgs e)
{
if (textBoxServer.Text.Length == 0)
{
return;
}
//拼接要访问的资源URI
ftpUriString = "ftp://" + textBoxServer.Text;
networkCredential = new NetworkCredential(textBoxUserName.Text, textBoxPassword.Text);
if (ShowFtpFileAndDirectory() == true)
{
buttonLogin.Enabled = false;
}
}
/// <summary>
/// 上传文件
/// </summary>
private void buttonUpload_Click(object sender, EventArgs e)
{
//选取要上传的文件
OpenFileDialog f = new OpenFileDialog();
if (f.ShowDialog() != DialogResult.OK)
{
return;
}
FileInfo fileInfo = new FileInfo(f.FileName);
string uri = GetUriString(fileInfo.Name);
FtpWebRequest request = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.UploadFile);
request.ContentLength = fileInfo.Length;
int buffLength = 8196;
byte[] buff = new byte[buffLength];
FileStream fs = fileInfo.OpenRead();
try
{
Stream responseStream = request.GetRequestStream();
int contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
responseStream.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
responseStream.Close();
fs.Close();
FtpWebResponse response = GetFtpResponse(request);
if (response == null)
{
return;
}
ShowFtpFileAndDirectory();
}
catch (Exception err)
{
MessageBox.Show(err.Message, "上传失败");
}
}
/// <summary>
/// 下载文件
/// </summary>
private void buttonDownload_Click(object sender, EventArgs e)
{
string fileName = GetSelectedFile();
if (fileName.Length == 0)
{
MessageBox.Show("请先选择要下载的文件");
return;
}
string filePath = Application.StartupPath + "\\DownLoad";
if (Directory.Exists(filePath) == false)
{
Directory.CreateDirectory(filePath);
}
Stream responseStream = null;
FileStream fileStream = null;
StreamReader reader = null;
try
{
string uri = GetUriString(fileName);
FtpWebRequest request = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse response = GetFtpResponse(request);
if (response == null)
{
return;
}
responseStream = response.GetResponseStream();
string path = filePath + "\\" + fileName;
fileStream = File.Create(path);
byte[] buffer = new byte[8196];
int bytesRead;
while (true)
{
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
{
break;
}
fileStream.Write(buffer, 0, bytesRead);
}
MessageBox.Show("下载完毕");
}
catch (UriFormatException err)
{
MessageBox.Show(err.Message);
}
catch (WebException err)
{
MessageBox.Show(err.Message);
}
catch (IOException err)
{
MessageBox.Show(err.Message);
}
finally
{
if (reader != null)
{
reader.Close();
}
else if (responseStream != null)
{
responseStream.Close();
}
if (fileStream != null)
{
fileStream.Close();
}
}
}
/// <summary>
/// 选项发生变化时触发
/// </summary>
private void listBoxFtp_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBoxFtp.SelectedIndex > 0)
{
string fileName = GetSelectedFile();
textBoxSelectedFile.Text = fileName;
}
}
/// <summary>
/// 双击listBoxFtp时触发
/// </summary>
private void listBoxFtp_DoubleClick(object sender, EventArgs e)
{
//返回上层目录
if (listBoxFtp.SelectedIndex == 0)
{
if (currentDir == "/")
{
MessageBox.Show("该目录已经是最顶层!", "",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
int index = currentDir.LastIndexOf("/");
if (index == 0)
{
currentDir = "/";
}
else
{
currentDir = currentDir.Substring(0, index);
}
ShowFtpFileAndDirectory();
}
else if (listBoxFtp.SelectedIndex > 0 && listBoxFtp.SelectedItem.ToString().Contains("[目录]"))
{
if (currentDir == "/")
{
currentDir = "/" + listBoxFtp.SelectedItem.ToString().Substring(4);
}
else
{
currentDir = currentDir + "/" + listBoxFtp.SelectedItem.ToString().Substring(4);
}
ShowFtpFileAndDirectory();
}
}
/// 从服务器获取指定路径下文件及子目录列表,并显示
/// </summary>
/// <returns>操作是否成功</returns>
private bool ShowFtpFileAndDirectory()
{
listBoxFtp.Items.Clear();
string uri = string.Empty;
if (currentDir == "/")
{
uri = ftpUriString;
}
else
{
uri = ftpUriString + currentDir;
}
FtpWebRequest request = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.ListDirectoryDetails);
//获取服务器端响应
FtpWebResponse response = GetFtpResponse(request);
if (response == null)
return false;
listBoxInfo.Items.Add("服务器返回:" + response.StatusDescription);
//读取网络流信息
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
string s = sr.ReadToEnd();
string[] ftpDir = s.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
//在listBoxInfo中显示服务器响应的原信息
listBoxInfo.Items.AddRange(ftpDir);
listBoxInfo.Items.Add("服务器返回:" + response.StatusDescription);
//添加单击能返回上层目录的项
listBoxFtp.Items.Add("返回上层目录");
int len = 0;
for (int i = 0; i < ftpDir.Length; i++)
{
if (ftpDir[i].EndsWith("."))
{
len = ftpDir[i].Length - 2;
break;
}
}
for (int i = 0; i < ftpDir.Length; i++)
{
s = ftpDir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (len < s.Length)
index = len;
else
continue;
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
continue;
//判断是否为目录,在项前进行表示
if (s[0] == 'd' || (s.ToLower()).Contains("<dir>"))
{
listBoxFtp.Items.Add("[目录]" + name);
}
}
for (int i = 0; i < ftpDir.Length; i++)
{
s = ftpDir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (len < s.Length)
index = len;
else
continue;
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
continue;
//判断是否为文件,在项前进行表示
if (!(s[0] == 'd' || (s.ToLower()).Contains("<dir>")))
{
listBoxFtp.Items.Add("[文件]" + name);
}
}
return true;
}
/// <summary>
/// 创建FtpWebRequest对象
/// </summary>
/// <param name="uri">资源标识</param>
/// <param name="requestMethod">要发送到服务器的命令</param>
/// <returns>FtpWebRequest对象</returns>
private FtpWebRequest CreateFtpWebRequest(string uri, string requestMethod)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
request.Credentials = networkCredential;
request.KeepAlive = false;
request.UseBinary = true;
request.Method = requestMethod;
return request;
}
/// <summary>
/// 获得服务器端响应信息
/// </summary>
/// <param name="request">FtpWebRequest对象</param>
/// <returns>FtpWebResponse对象</returns>
private FtpWebResponse GetFtpResponse(FtpWebRequest request)
{
FtpWebResponse response = null;
try
{
response = (FtpWebResponse)request.GetResponse();
return response;
}
catch (WebException err)
{
listBoxInfo.Items.Add("出现异常,FTP返回状态:" + err.Status.ToString());
FtpWebResponse e = (FtpWebResponse)err.Response;
listBoxInfo.Items.Add("Status Code :" + e.StatusCode);
listBoxInfo.Items.Add("Status Description :" + e.StatusDescription);
return null;
}
catch (Exception err)
{
listBoxInfo.Items.Add(err.Message);
return null;
}
}
/// <summary>
/// 获取在listBoxFtp中所选择文件的文件名
/// </summary>
/// <returns>所选择文件的文件名</returns>
private string GetSelectedFile()
{
string fileName = "";
if (!(listBoxFtp.SelectedIndex == -1 ||
listBoxFtp.SelectedItem.ToString().Substring(0, 4) == "[目录]"))
{
fileName = listBoxFtp.SelectedItem.ToString().Substring(4).Trim();
}
return fileName;
}
private string GetUriString(string fileName)
{
string uri = string.Empty;
if (currentDir.EndsWith("/"))
{
uri = ftpUriString + currentDir + fileName;
}
else
{
uri = ftpUriString + currentDir + "/" + fileName;
}
return uri;
}
}
}
using System.IO; //调用以下函数
private FtpStatusCode UploadFun(string fileName, string uploadUrl)
{
Stream requestStream = null;
FileStream fileStream = null;
FtpWebResponse uploadResponse = null;
try
{
FtpWebRequest uploadRequest =
(FtpWebRequest)WebRequest.Create(uploadUrl);
uploadRequest.Method = WebRequestMethods.Ftp.UploadFile; uploadRequest.Proxy = null;
NetworkCredential nc = new NetworkCredential();
nc.UserName = “aa”;
nc.Password = “aa123″; uploadRequest.Credentials = nc; //修改getCredential();错误2requestStream = uploadRequest.GetRequestStream();
fileStream = File.Open(fileName, FileMode.Open); byte[] buffer = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = fileStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
requestStream.Write(buffer, 0, bytesRead);
}
requestStream.Close(); uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();
return uploadResponse.StatusCode; }
catch (UriFormatException ex)
{
}
catch (IOException ex)
{
}
catch (WebException ex)
{
}
finally
{
if (uploadResponse != null)
uploadResponse.Close();
if (fileStream != null)
fileStream.Close();
if (requestStream != null)
requestStream.Close();
}
return FtpStatusCode.Undefined;
} C# FTP
/// 从服务器获取指定路径下文件及子目录列表,并显示
/// </summary>
/// <returns>操作是否成功</returns>
private bool ShowFtpFileAndDirectory()
{
listBoxFtp.Items.Clear();
string uri = string.Empty;
if (currentDir == "/")
{
uri = ftpUriString;
}
else
{
uri = ftpUriString + currentDir;
}
FtpWebRequest request = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.ListDirectoryDetails);
//获取服务器端响应
FtpWebResponse response = GetFtpResponse(request);
if (response == null)
return false;
listBoxInfo.Items.Add("服务器返回:" + response.StatusDescription);
//读取网络流信息
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
string s = sr.ReadToEnd();
string[] ftpDir = s.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
//在listBoxInfo中显示服务器响应的原信息
listBoxInfo.Items.AddRange(ftpDir);
listBoxInfo.Items.Add("服务器返回:" + response.StatusDescription);
//添加单击能返回上层目录的项
listBoxFtp.Items.Add("返回上层目录");
int len = 0;
for (int i = 0; i < ftpDir.Length; i++)
{
if (ftpDir[i].EndsWith("."))
{
len = ftpDir[i].Length - 2;
break;
}
}
for (int i = 0; i < ftpDir.Length; i++)
{
s = ftpDir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (len < s.Length)
index = len;
else
continue;
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
continue;
//判断是否为目录,在项前进行表示
if (s[0] == 'd' || (s.ToLower()).Contains("<dir>"))
{
listBoxFtp.Items.Add("[目录]" + name);
}
}
for (int i = 0; i < ftpDir.Length; i++)
{
s = ftpDir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (len < s.Length)
index = len;
else
continue;
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
continue;
//判断是否为文件,在项前进行表示
if (!(s[0] == 'd' || (s.ToLower()).Contains("<dir>")))
{
listBoxFtp.Items.Add("[文件]" + name);
}
}
return true;
}
/// <summary>
/// 创建FtpWebRequest对象
/// </summary>
/// <param name="uri">资源标识</param>
/// <param name="requestMethod">要发送到服务器的命令</param>
/// <returns>FtpWebRequest对象</returns>
private FtpWebRequest CreateFtpWebRequest(string uri, string requestMethod)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
request.Credentials = networkCredential;
request.KeepAlive = false;
request.UseBinary = true;
request.Method = requestMethod;
return request;
}
/// <summary>
/// 获得服务器端响应信息
/// </summary>
/// <param name="request">FtpWebRequest对象</param>
/// <returns>FtpWebResponse对象</returns>
private FtpWebResponse GetFtpResponse(FtpWebRequest request)
{
FtpWebResponse response = null;
try
{
response = (FtpWebResponse)request.GetResponse();
return response;
}
catch (WebException err)
{
listBoxInfo.Items.Add("出现异常,FTP返回状态:" + err.Status.ToString());
FtpWebResponse e = (FtpWebResponse)err.Response;
listBoxInfo.Items.Add("Status Code :" + e.StatusCode);
listBoxInfo.Items.Add("Status Description :" + e.StatusDescription);
return null;
}
catch (Exception err)
{
listBoxInfo.Items.Add(err.Message);
return null;
}
}
/// <summary>
/// 获取在listBoxFtp中所选择文件的文件名
/// </summary>
/// <returns>所选择文件的文件名</returns>
private string GetSelectedFile()
{
string fileName = "";
if (!(listBoxFtp.SelectedIndex == -1 ||
listBoxFtp.SelectedItem.ToString().Substring(0, 4) == "[目录]"))
{
fileName = listBoxFtp.SelectedItem.ToString().Substring(4).Trim();
}
return fileName;
}
private string GetUriString(string fileName)
{
string uri = string.Empty;
if (currentDir.EndsWith("/"))
{
uri = ftpUriString + currentDir + fileName;
}
else
{
uri = ftpUriString + currentDir + "/" + fileName;
}
return uri;
}
}
}
using System;
using System.Collections.Generic;
using System.Windows.Forms;
//新添加的命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Globalization;namespace FtpServer
{
public partial class MainForm : Form
{
TcpListener myTcpListener;
Dictionary<string, string> users; //保存用户名和密码
public MainForm()
{
InitializeComponent();
users = new Dictionary<string, string>();
users.Add("liuchongxin", "12345");
users.Add("huanghuibin", "54321");
//设置默认主目录
textBox1.Text = "e:/ls/";
}
//单击【启动FTP服务】触发的事件
private void buttonStart_Click(object sender, EventArgs e)
{
this.listBoxStatus.Items.Add("FTP服务已启动");
Thread t = new Thread(ListenClientConnect);
t.IsBackground = true;
t.Start();
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
/// <summary>监听端口,处理客户端连接</summary>
private void ListenClientConnect()
{
myTcpListener = new TcpListener(IPAddress.Any, 21);
myTcpListener.Start();
while (true)
{
try
{
TcpClient client = myTcpListener.AcceptTcpClient();
AddInfo(string.Format("{0}和本机({1})建立FTP连接", client.Client.RemoteEndPoint, myTcpListener.LocalEndpoint));
User user = new User();
user.commandSession = new UserSession(client);
user.workDir = textBox1.Text;
Thread t = new Thread(UserProcessing);
t.IsBackground = true;
t.Start(user);
}
catch
{
break;
}
}
}
/// <summary>
/// 处理USER命令,但不进行用户名验证
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="command">命令</param>
/// <param name="param">参数</param>
private void CommandUser(User user, string command, string param)
{
string sendString = string.Empty;
if (command == "USER")
{
sendString = "331 USER command OK, password required.";//用户名正确,需要口令
user.userName = param;
user.LoginOK = 1; //1表示已接收到用户名,等待接收密码
}
else
{
sendString = "501 USER command syntax error(USER命令语法错误语法错误).";
}
ReplyCommandToUser(user, sendString);
}
/// <summary>
/// 处理密码命令,验证用户名和密码
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="command">命令</param>
/// <param name="param">参数</param>
private void CommandPassword(User user, string command, string param)
{
string sendString = string.Empty;
if (command == "PASS")
{
string password = null;
if (users.TryGetValue(user.userName, out password))
{
if (password == param)
{
sendString = "230 User logged in success";//用户已登录
user.LoginOK = 2; //2表示登录成功
}
else
sendString = "530 Password incorrect.";//登录失败密码不正确
}
else
{
sendString = "530 User name or password incorrect.";//用户名或密码不正确
}
}
else
{
sendString = "501 PASS command Syntax error.";//PASS命令语法错误
}
ReplyCommandToUser(user, sendString);
//用户当前工作目录
user.CurrentDir = user.workDir;
}
/// <summary>
/// 处理CWD命令,改变工作目录
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="temp">目录路径部分信息</param>
private void CommandCWD(User user, string temp)
{
string sendString = string.Empty;
try
{
string dir = user.workDir.TrimEnd('/') + temp;
//是当前目录的子目录,且不包含父目录名称
if (Directory.Exists(dir))
{
user.CurrentDir = dir;
sendString = "250 Directory changed to '" + dir + "' successfully";//请求的文件操作完成
}
else
{
sendString = "550 Directory '" + dir + "' does not exist";//未执行请求的操作
}
}
catch
{
sendString = "502 Directory changed unsuccessfull";//命令未实现
}
ReplyCommandToUser(user, sendString);
}
/// <summary>
/// 增加尾缀
/// </summary>
/// <param name="s">要增加的尾缀</param>
/// <returns></returns>
private String AddEnd(String s)
{
if (!s.EndsWith("/"))
s += "/";
return s;
}
/// <summary>
/// 处理PWD命令,显示工作目录
/// </summary>
/// <param name="user">客户端信息</param>
private void CommandPWD(User user)
{
string sendString = string.Empty;
sendString = "257 '" + user.CurrentDir + "' is the current directory";// 创建PATHNAME(路径)
ReplyCommandToUser(user, sendString);
}
/// <summary>
/// 处理PASV命令,设置数据传输模式
/// </summary>
/// <param name="user">客户端信息</param>
private void CommandPASV(User user)
{
string sendString = string.Empty;
IPAddress localIP = Dns.GetHostEntry("").AddressList[0];
//被动模式
Random random = new Random();
int randNum1, randNum2, port;
while (true)
{
randNum1 = random.Next(5, 200);
randNum2 = random.Next(0, 200);
port = (randNum1 << 8) | randNum2;
try
{
user.dataListener = new TcpListener(localIP, port);
AddInfo("被动模式--" + localIP.ToString() + ":" + port);
}
catch
{
continue;
}
user.isPassive = true;
string tmp = localIP.ToString().Replace('.', ',');
sendString = "227 Entering Passive Mode (" + tmp + "," + randNum1 + "," + randNum2 + ")进入被动模式";
ReplyCommandToUser(user, sendString);
user.dataListener.Start();
break;
}
}
/// <summary>
/// 处理PORT命令,使用主动模式进行传输,获取客户端发过来的数据连接ip及端口信息
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="portString">端口信息</param>
private void CommandPORT(User user, string portString)
{
string sendString = string.Empty;
String[] tmp = portString.Split(',');
String ipString = "" + tmp[0] + "." + tmp[1] + "." + tmp[2] + "." + tmp[3];
int portNum = (int.Parse(tmp[4]) << 8) | int.Parse(tmp[5]);
user.remoteEndPoint = new IPEndPoint(IPAddress.Parse(ipString), portNum);
sendString = "200 PORT command successful(命令成功).";
ReplyCommandToUser(user, sendString);
}
/// 处理LIST命令,向客户端发送当前或指定工作目录下的所有文件名和子目录名
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="parameter">指定工作目录</param>
private void CommandLIST(User user, string parameter)
{
string sendString = string.Empty;
DateTimeFormatInfo m = new CultureInfo("en-US", true).DateTimeFormat;
//得到目录列表
string[] dir = Directory.GetDirectories(user.CurrentDir);
if (string.IsNullOrEmpty(parameter) == false)
{
if (Directory.Exists(user.CurrentDir + parameter))
{
dir = Directory.GetDirectories(user.CurrentDir + parameter);
}
else
{
string s = user.CurrentDir.TrimEnd('/');
user.CurrentDir = s.Substring(0, s.LastIndexOf("/") + 1);
}
}
for (int i = 0; i < dir.Length; i++)
{
string folderName = Path.GetFileName(dir[i]);
DirectoryInfo d = new DirectoryInfo(dir[i]);
//为了能用CuteFTP客户端测试本程序,按下面的格式输出目录列表
sendString += @"dwr-\t" + Dns.GetHostName() + "\t" +
m.GetAbbreviatedMonthName(d.CreationTime.Month) +
d.CreationTime.ToString(" dd yyyy") + "\t" +
folderName + Environment.NewLine;
}
//得到文件列表
string[] files = Directory.GetFiles(user.CurrentDir);
if (string.IsNullOrEmpty(parameter) == false)
{
if (Directory.Exists(user.CurrentDir + parameter + "/"))
{
files = Directory.GetFiles(user.CurrentDir + parameter + "/");
}
}
for (int i = 0; i < files.Length; i++)
{
FileInfo f = new FileInfo(files[i]);
string fileName = Path.GetFileName(files[i]);
//为了能用CuteFTP客户端测试本程序,按下面的格式输出文件列表
sendString += "-wr-\t" + Dns.GetHostName() + "\t" + f.Length +
" " + m.GetAbbreviatedMonthName(f.CreationTime.Month) +
f.CreationTime.ToString(" dd yyyy") + "\t" +
fileName + Environment.NewLine;
}
bool isBinary = user.isBinary;
user.isBinary = false;
ReplyCommandToUser(user, "150 Opening ASCII mode data connection");//文件状态良好,ASCII模式数据连接将要打开
InitDataSession(user);
SendByUserSession(user, sendString);
ReplyCommandToUser(user, "226 Transfer complete.");//传输完成 关闭数据连接,请求的文件操作成功
user.isBinary = isBinary;
}
/// <summary>
/// 处理RETR命令,提供下载功能,将用户请求的文件发送给用户
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="fileName">用户请求的文件信息</param>
private void CommandRETR(User user, string fileName)
{
string sendString = "";
//下载的文件全名
string path = user.CurrentDir + fileName;
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
// 发送150到用户,意思为服务器文件状态良好
if (user.isBinary)
{
sendString = "150 Opening BINARY mode data connection for download";//文件状态良好,打开二进制模式数据连接准备下载
}
else
{
sendString = "150 Opening ASCII mode data connection for download";//文件状态良好,打开ASCII模式数据连接准备下载
}
ReplyCommandToUser(user, sendString);
InitDataSession(user);
SendFileByUserSession(user, fs);
ReplyCommandToUser(user, "226 Transfer complete.");//传输完成 关闭数据连接,请求的文件操作成功
}
/// <summary>
/// 处理STOR命令,提供上传功能,接收用户上传的文件
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="fileName">用户上传的文件信息</param>
private void CommandSTOR(User user, string fileName)
{
string sendString = "";
//上传的文件全名
string path = user.CurrentDir + fileName;
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
// 发送150到用户,意思为服务器状态良好
if (user.isBinary)
{
sendString = "150 Opening BINARY mode data connection for upload";//文件状态良好,打开二进制模式数据连接准备接收文件
}
else
{
sendString = "150 Opening ASCII mode data connection for upload";//文件状态良好,打开ASCII模式数据连接准备接收文件
}
ReplyCommandToUser(user, sendString);
InitDataSession(user);
ReadFileByUserSession(user, fs);
ReplyCommandToUser(user, "226 Transfer complete.");//传输完成 关闭数据连接,请求的文件操作成功
}
/// <summary>
/// 处理TYPE命令,设置数据传输方式
/// </summary>
/// <param name="user">客户端信息</param>
/// <param name="param">数据传输方式</param>
private void CommandTYPE(User user, string param)
{
string sendString = "";
if (param == "I")
{
//二进制方式
user.isBinary = true;
sendString = "200 Type set to I";//命令成功,类型设置为Binary
}
else
{
//ASCII方式
user.isBinary = false;
sendString = "200 Type set to A";//命令成功,类型设置为ASCII
}
ReplyCommandToUser(user, sendString);
}