0

我是这个网站的新手,所以如果我犯了任何格式错误,我提前道歉。让我知道是否需要进一步澄清。

我目前正在使用 C# 编写一个程序,该程序旨在从多个 http 或 ftp 源下载文件。

我希望它通过几个 IP 地址,然后检查几种方法是否可以成功下载已知文件。如果其中一种方法可以成功下载文件,它应该转到下一个 IP 并再次执行相同的操作。

到目前为止,我正在使用一个 foreach 循环,该循环遍历包含 IP 的数组并创建一个名为“IPxx”的文件夹以及一个 FTP 和 HTTP URI,因为我事先不知道哪个 IP 需要 FTP 或 HTTP 地址:

string[] ipArray = new string[4];

ipArray[0]= "xxx.xxx.xxx.xx";
ipArray[1]= "xxx.xxx.xxx.xx";
ipArray[2]= "xxx.xxx.xxx.xx";
ipArray[3]= "xxx.xxx.xxx.xx";

foreach(string ip in ipArray )                                 
{
    string ipXx = "IP" + ip.Substring(ip.Length-2);             
    string ipOrdner = folder + @"\" +  ipXx;                  
    Directory.CreateDirectory(ipOrdner);                           
    string ftpAddr= "ftp://" + ip;
    string httpAddr= "http://"+ip;

    //DownloadTestMethod(httpAddr, ipFolder);
    //DownloadTestMethod2(ftpAddr, ipFolder);
    //DownloadTestMethod3(htppAddr, ipFolder);
}

到目前为止一切顺利,达到这个水平的一切都按预期工作。但是,当我需要通过几种下载方法并检查我是否可以成功下载文件时,我会很挣扎,如果不能,它应该转到下一个下载方法并尝试相同的方法。

我想出了以下下载测试方法:

public static void DownloadTestMethod(string httpAddr, string ipFolder)
{

    string fileName = "test_10k.bin";                    
    string downloadpath = httpAddr + "/" + fileName;

    // I want it to check if the http site is online/working   
    WebRequest request = WebRequest.Create(downloadpath);   

    request.Proxy.Credentials = CredentialCache.DefaultCredentials;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    if (response != null)
    {

        WebClient webClient = new WebClient();
        webClient.Proxy.Credentials=CredentialCache.DefaultCredentials;                                  
        webClient.DownloadFile(downloadpath, ipFolder + @"\" + fileName);           
    }
}

它适用于成功下载的文件,但是如果该方法无法下载请求的文件,我似乎会在此方法中“卡住”。在这种情况下,我希望它跳转到下一个 DownloadMethod 并再次检查,直到检查完所有方法。

此外,如果该程序通过每个 IP 并且无法下载任何内容,我希望它发送一封自动电子邮件。我知道如何实现 EmailMethod,但我又一次遇到了流控制。

我是一个绝对的初学者,不知道如何从这里获得我想要的流量。

4

1 回答 1

0

您可能想查看 Task Parallel Library,尤其是它的 WhenAll() 方法。在它下面,您可能希望查看任何方法返回错误/引发异常的情况下的错误处理。

https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

于 2016-04-21T07:10:41.720 回答