Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当成功连接到ftp服务器时,如何检查并通知用户?_C#_.net_Winforms_Ftp - Fatal编程技术网

C# 当成功连接到ftp服务器时,如何检查并通知用户?

C# 当成功连接到ftp服务器时,如何检查并通知用户?,c#,.net,winforms,ftp,C#,.net,Winforms,Ftp,在这个按钮2点击事件中,我启动了一个backgroundworker,它将从我的ftp服务器检索所有目录和文件,并将在树视图上实时显示它们 private void button2_Click(object sender, EventArgs e) { label13.Text = "Retrieving ftp content please wait"; button2.Enabled = false; b

在这个按钮2点击事件中,我启动了一个backgroundworker,它将从我的ftp服务器检索所有目录和文件,并将在树视图上实时显示它们

private void button2_Click(object sender, EventArgs e)
        {
            label13.Text = "Retrieving ftp content please wait";
            button2.Enabled = false;
            button3.Enabled = false;
            toolStripProgressBar2.Visible = true;
            backgroundWorker1.RunWorkerAsync(txtHost.Text);
        }
在backgoundworker1 do work事件中,我执行了以下操作:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var root = Convert.ToString(e.Argument);  // txtHost.Text;

            searched_until_now_dirs = 0;
            total_dirs = 1;
            max_percentage = 0;
            last_update = DateTime.Now;
            directories_real_time = new TreeNode();
            var dirNode = CreateDirectoryNode(root, "root",1);

            e.Result = dirNode;
        }
方法CreateDirectoryNode

private int total_dirs;
        private int searched_until_now_dirs;
        private int max_percentage;
        private TreeNode directories_real_time;
        private string SummaryText;

        private TreeNode CreateDirectoryNode(string path, string name , int recursive_levl )
        {
            var directoryNode = new TreeNode(name);
            var directoryListing = GetDirectoryListing(path);

        }
和GetDirectoryListing:

public IEnumerable<FTPListDetail> GetDirectoryListing(string rootUri)
        {
            var CurrentRemoteDirectory = rootUri;
            var result = new StringBuilder();
            var request = GetWebRequest(WebRequestMethods.Ftp.ListDirectoryDetails, CurrentRemoteDirectory);
            using (var response = request.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    string line = reader.ReadLine();
                    while (line != null)
                    {
                        result.Append(line);
                        result.Append("\n");
                        line = reader.ReadLine();
                    }
                    if (string.IsNullOrEmpty(result.ToString()))
                    {
                        return new List<FTPListDetail>();
                    }
                    result.Remove(result.ToString().LastIndexOf("\n"), 1);
                    var results = result.ToString().Split('\n');
                    string regex =
                        @"^" +               //# Start of line
                        @"(?<dir>[\-ld])" +          //# File size          
                        @"(?<permission>[\-rwx]{9})" +            //# Whitespace          \n
                        @"\s+" +            //# Whitespace          \n
                        @"(?<filecode>\d+)" +
                        @"\s+" +            //# Whitespace          \n
                        @"(?<owner>\w+)" +
                        @"\s+" +            //# Whitespace          \n
                        @"(?<group>\w+)" +
                        @"\s+" +            //# Whitespace          \n
                        @"(?<size>\d+)" +
                        @"\s+" +            //# Whitespace          \n
                        @"(?<month>\w{3})" +          //# Month (3 letters)   \n
                        @"\s+" +            //# Whitespace          \n
                        @"(?<day>\d{1,2})" +        //# Day (1 or 2 digits) \n
                        @"\s+" +            //# Whitespace          \n
                        @"(?<timeyear>[\d:]{4,5})" +     //# Time or year        \n
                        @"\s+" +            //# Whitespace          \n
                        @"(?<filename>(.*))" +            //# Filename            \n
                        @"$";                //# End of line

                    var myresult = new List<FTPListDetail>();
                    foreach (var parsed in results)
                    {
                        var split = new Regex(regex)
                            .Match(parsed);
                        var dir = split.Groups["dir"].ToString();
                        var permission = split.Groups["permission"].ToString();
                        var filecode = split.Groups["filecode"].ToString();
                        var owner = split.Groups["owner"].ToString();
                        var group = split.Groups["group"].ToString();
                        var filename = split.Groups["filename"].ToString();
                        var size = split.Groups["size"].Length;
                        myresult.Add(new FTPListDetail()
                        {
                            Dir = dir,
                            Filecode = filecode,
                            Group = group,
                            FullPath = CurrentRemoteDirectory + "/" + filename,
                            Name = filename,
                            Owner = owner,
                            Permission = permission,
                        });
                    };
                    return myresult;
                }
            }
        }
当我单击按钮并启动backgroundworker时,需要几秒钟的时间,直到它开始检索目录和文件并在树视图上显示它们

private void button2_Click(object sender, EventArgs e)
        {
            label13.Text = "Retrieving ftp content please wait";
            button2.Enabled = false;
            button3.Enabled = false;
            toolStripProgressBar2.Visible = true;
            backgroundWorker1.RunWorkerAsync(txtHost.Text);
        }
我现在想做的是在GetwebRequest中,我认为在这个方法中,等待直到我成功连接到ftp服务器,然后才开始重新查看目录和文件。 如果连接服务器时出现erorr/问题,请使用标签(例如)将其显示给用户,并停止backgroundworker


但是,如果用户在操作开始之前成功或未成功连接到ftp服务器,整个想法是给用户一些消息。

当您在
GetWebRequest
中遇到错误时,您已经返回空值,这意味着您无法获得工作连接。在
GetDirectoryListning
中,您应该捕获此空值并将其抛出到后台DoWork事件中。在里面,您可以检查null,如果需要,可以在后台工作程序上调用.cancel方法。这将完成dowork事件并触发RunWorkerComplete事件

然后使用RunWorkerCompletedEventHandler将标签设置为连接失败时要显示的值。微软写了一个例子如何做到这一点