当前位置:编程学习 > C#/ASP.NET >>

新手,用C#编写ftp系统,完成后有问题,搞不懂,求救啊, 急

 
 
 客户端代码:
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>
        /// 从服务器获取指定路径下文件及子目录列表,并显示
        /// </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.Net;
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();错误2

requestStream = 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>
        /// 从服务器获取指定路径下文件及子目录列表,并显示
        /// </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);
        }
         --------------------编程问答--------------------  /// <summary>
        /// 处理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);
        }
         --------------------编程问答-------------------- 蛋帖~谁这么有时间给你看完这代码就真的是~~~ --------------------编程问答-------------------- 以前有一本书上完整的FTP模块,你需要的话,留个邮件给你发,真的没有时间看这么长的代码。 --------------------编程问答-------------------- 我这也是书上的例子 liuchongxin2005@163.com
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,