大家帮忙看下这个ftp客户端哪里出问题,返回上层目录时报错:WebException,ProtocolError,ActionNotTakenFileUnavailable,550 教学课件/陈海山/教学课件:No such file or directoryusing System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;namespace FtpClientExample
{
    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();            textBoxServer.Text = "**.**.*.**";
            textBoxUserName.Text = "*****";
            textBoxPassword.Text = "******";
        }
        /// <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>

解决方案 »

  1.   

            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 = true;
                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;
            }        private void FormMain_Load(object sender, EventArgs e)
            {        }   
        }
    }
      

  2.   

    ...终于发现问题所在,把request.KeepAlive = true;
    改成request.KeepAlive = false;就可以返回上层目录啦