C# 当成功连接到ftp服务器时,如何检查并通知用户?
在这个按钮2点击事件中,我启动了一个backgroundworker,它将从我的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
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将标签设置为连接失败时要显示的值。微软写了一个例子如何做到这一点