客户端代码:
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();
            }
        }
       

解决方案 »

  1.   

     /// <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;
            }
        }
    }
      

  2.   

    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();错误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
      

  3.   

     /// <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;
            }
        }
    }
      

  4.   

    服务器代码:
    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);
            }
            
      

  5.   

     /// <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);
            }
            
      

  6.   

    以前有一本书上完整的FTP模块,你需要的话,留个邮件给你发,真的没有时间看这么长的代码。
      

  7.   

    我这也是书上的例子 [email protected]