首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 关于一个FTP连接有关问题

2013-12-02 
C# 关于一个FTP连接问题问题描述如下:如图,输入FTP服务器IP地址,FTP登录名,FTP登录密码。假设三者正确的登

C# 关于一个FTP连接问题
问题描述如下:
C# 关于一个FTP连接有关问题
如图,输入FTP服务器IP地址,FTP登录名,FTP登录密码。假设三者正确的登录信息为[192.168.1.8,myusername,mypassword]。
第一次输入正确的三者信息[192.168.1.8,myusername,mypassword],点设置按钮,反馈回来连接成功;
然后我故意输入错的登录名[192.168.1.8,myusername1,mypassword],反馈回来连接失败。
接着我修改登录名为正确用户名,并故意输入错的登录密码[192.168.1.8,myusername,mypassword1],反馈回来的结果是连接成功。
我的代码可以动态读取用户名信息,但密码一旦登录成功则就一直不变了,我的需求就是第一次登录成功后,接着修改登录密码为错的登录密码后,就不允许登录成功。


//声明全局变量
private string ftpUristring = null;
private NetworkCredential networkCredential;
private string currentDir = "/";
//设置按钮事件
        private void setBtn_Click(object sender, EventArgs e)
        {
            try
            {
                if (FTPIpTxt.Text == string.Empty || FTPUsernameTxt.Text == string.Empty)
                {
                    MessageBox.Show("FTP服务器IP或者用户名不能为空", "提示");
                    return;
                }
                ftpUristring = "ftp://" + FTPIpTxt.Text;
                networkCredential = new NetworkCredential(FTPUsernameTxt.Text, FTPPasswordTxt.Text);
                if (ShowFtpFileAndDirectory() == true)
                {
                    listReports.Enabled = true;
                    listStatus.Enabled = true;
                    loginStatusLabel.Visible = true;
                    loginStatusLabel.Text = "登录成功";
                }
                else
                {
                    listStatus.Enabled = true;
                    loginStatusLabel.Visible = true;
                    loginStatusLabel.Text = "登录失败";
                }
            }
            catch(Exception ex)
            { MessageBox.Show(ex.Message); }
        }
// 定义布尔函数ShowFtpFileAndDirectory,处理FTP连接并显示资源列表,如果返回正确的服务器回应信息,则传递true值到button事件,如果FTP连接失败返回错误的服务器回应信息,则传递false值到button事件
  private bool ShowFtpFileAndDirectory()
        {
            listReports.Items.Clear();
            string uri = string.Empty;
            if (currentDir == "/")
            {
                uri = ftpUristring;
            }
            else
            {
                uri = ftpUristring + currentDir;
            }
            string[] urifield = uri.Split(' ');
            uri = urifield[0];
            FtpWebRequest request= CreateFtpWebRequest(uri, WebRequestMethods.Ftp.ListDirectoryDetails);

            // 获得服务器返回的响应信息


            FtpWebResponse response = GetFtpResponse(request);
            if (response == null)
            {
                return false;
            }
            listStatus.Items.Add("连接成功,服务器返回的是:" + response.StatusCode + " " + response.StatusDescription);

            // 读取网络流数据
            Stream stream = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(stream, Encoding.Default);
            listStatus.Items.Add("获取响应流....");
            string s = streamReader.ReadToEnd();
            streamReader.Close();
            stream.Close();
            response.Close();
            listStatus.Items.Add("传输完成");
            // 处理并显示文件目录列表
            string[] ftpdir = s.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            listReports.Items.Add("↑返回上层目录");
            int length = 0;
            for (int i = 0; i < ftpdir.Length; i++)
            {
                if (ftpdir[i].EndsWith("."))
                {
                    length = 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 (length < s.Length)
                    {
                        index = length;
                    }
                    else
                    {
                        continue;
                    }
                }
                string name = s.Substring(index + 1);
                if (name == "." || name == "..")
                {
                    continue;
                }
                // 判断是否为目录,在名称前加"目录"来表示
                if (s[0] == 'd' || (s.ToLower()).Contains("<dir>"))


                {
                    string[] namefield = name.Split(' ');
                    int namefieldlength = namefield.Length;
                    string dirname;
                    dirname = namefield[namefieldlength - 1];

                    // 对齐
                    dirname = dirname.PadRight(34, ' ');
                    name = dirname;
                    // 显示目录
                    listReports.Items.Add("[目录]" + name);
                }
            }

            for (int i = 0; i < ftpdir.Length; i++)
            {
                s = ftpdir[i];
                int index = s.LastIndexOf('\t');
                if (index == -1)
                {
                    if (length < s.Length)
                    {
                        index = length;
                    }
                    else
                    {
                        continue;
                    }
                }
                string name = s.Substring(index + 1);
                if (name == "." || name == "..")
                {
                    continue;
                }
                // 判断是否为文件
                if (!(s[0] == 'd' || (s.ToLower()).Contains("<dir>")))
                {
                    string[] namefield = name.Split(' ');
                    int namefieldlength = namefield.Length;
                    string filename;
                    filename = namefield[namefieldlength - 1];
                    // 对齐
                    filename = filename.PadRight(34, ' ');
                    name = filename;
                    // 显示文件


                    listReports.Items.Add(name);
                }
            }
            return true;
        }
        // 创建FTP连接
       //我觉得问题出在这里,正确登录过一次之后,无论后来怎么修改密码,点设置,都可以成功登录,貌似正确密码缓存到了某个地方没有被清空
        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;
        }
        // 获取服务器返回的响应体
        private FtpWebResponse GetFtpResponse(FtpWebRequest request)
        {
            FtpWebResponse response = null;
            try
            {
                response = (FtpWebResponse)request.GetResponse();
                listStatus.Items.Add("验证完毕,服务器回应信息:[" + response.WelcomeMessage + "]");
                listStatus.Items.Add("正在连接:[ " + response.BannerMessage + "]");
                listStatus.TopIndex = listStatus.Items.Count - 1;
                return response;
            }
            catch (WebException ex)
            {
                listStatus.Items.Add("发送错误。返回信息为:" + ex.Status);
                listStatus.TopIndex = listStatus.Items.Count - 1;
                return null;
            }
        }

FTP连接
[解决办法]
这个要看FTP服务器是怎么登录的 是匿名登录 还其它的 
[解决办法]
好像木有完全理解你的想法。
[解决办法]
如果你没有退出登录,第二次连接是不需要提供用户凭据的,也就是说你提供的密码是不起任何作用,不会验证,除非你先退出登录。
FtpWebRequest.KeepAlive 属性默认值是true,意思是当你Close后也保持连接,下次请求不需要验证用户(除非更换用户名)。你可以改为false,但这样效率会降低。

热点排行