下载文件的重试机制

时间:2013-07-18 05:25:27

标签: c#

我创建了一个在FTP文件夹中查找文件的函数。

    public static List<string> GetFileList(NetworkCredential credential, string FTPSite, string FTPFolder, string extension)
    {
        string LSOutput = "";
        List<string> files = new List<string>();

            //Fetch LS
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(@"ftp://" + FTPSite + FTPFolder);
            request.Credentials = credential;
            request.UseBinary = true;
            request.EnableSsl = true;
            request.Method = WebRequestMethods.Ftp.ListDirectory;
            FtpWebResponse response = null;
            response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            LSOutput = reader.ReadToEnd();
            reader.Close();
            response.Close();

            PrepareLog("LS output while finding files:");
            PrepareLog(LSOutput);


        //Parse the LS
        string[] LSOutputLines = LSOutput.Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        foreach (string LSOutputLine in LSOutputLines)
            files.Add(LSOutputLine);

        //Filter files
        files = files.Where(f => f.ToLower().EndsWith(extension.ToLower())).ToList();

        PrepareLogAndEmail("Total " + extension.ToLower() + " files found: " + files.Count, LogMessageType.Simple);
        return files;
    }

异常处理在调用函数的位置完成。 现在问题是,有时FTP面临一些问题(如超时),然后我们必须重新运行该程序。

我被要求添加3次重试机制,这就是我尝试重试一次。

    public static List<string> GetFileList(NetworkCredential credential, string FTPSite, string FTPFolder, string extension)
    {
        string LSOutput = "";
        List<string> files = new List<string>();

        try
        {
            //Fetch LS
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(@"ftp://" + FTPSite + FTPFolder);
            request.Credentials = credential;
            request.UseBinary = true;
            request.EnableSsl = true;
            request.Method = WebRequestMethods.Ftp.ListDirectory;
            FtpWebResponse response = null;
            response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            LSOutput = reader.ReadToEnd();
            reader.Close();
            response.Close();

            PrepareLog("LS output while finding files:");
            PrepareLog(LSOutput);
        }
        catch (Exception ex)
        {
            PrepareLogAndEmail("First attempt failed: Details: " + ex.Message, LogMessageType.AttemptFailed);
            PrepareLogAndEmail("Second attempt started" + ex.Message, LogMessageType.Simple);

            //Fetch LS
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(@"ftp://" + FTPSite + FTPFolder);
            request.Credentials = credential;
            request.UseBinary = true;
            request.EnableSsl = true;
            request.Method = WebRequestMethods.Ftp.ListDirectory;
            FtpWebResponse response = null;
            response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            LSOutput = reader.ReadToEnd();
            reader.Close();
            response.Close();

            PrepareLog("LS output while finding files(second attempt):");
            PrepareLog(LSOutput);
        }


        //Parse the LS
        string[] LSOutputLines = LSOutput.Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        foreach (string LSOutputLine in LSOutputLines)
            files.Add(LSOutputLine);

        //Filter files
        files = files.Where(f => f.ToLower().EndsWith(extension.ToLower())).ToList();

        PrepareLogAndEmail("Total " + extension.ToLower() + " files found: " + files.Count, LogMessageType.Simple);
        return files;
    }

现在,如果我需要再添加2次尝试,我是否需要进行此类daiys链接或是否有其他更清洁的选项?

1 个答案:

答案 0 :(得分:1)

我会使用重试循环,如下面的

您会注意到我使用bolean标记出成功下载,或重试计数终止。

我甚至会更改上一部分以检查下载是否成功,并通知用户是否存在,甚至可以记录错误消息。

    public static List<string> GetFileList(NetworkCredential credential, string FTPSite, string FTPFolder, string extension)
    {
        List<string> files = new List<string>();
        int retries = 0;
        int maxRetries = 5;
        bool downloaded = false;
        string LSOutput = "";
        while (!downloaded && retries < maxRetries)
        {
            try
            {
                LSOutput = "";
                //Fetch LS
                FtpWebRequest request = (FtpWebRequest) WebRequest.Create(@"ftp://" + FTPSite + FTPFolder);
                request.Credentials = credential;
                request.UseBinary = true;
                request.EnableSsl = true;
                request.Method = WebRequestMethods.Ftp.ListDirectory;
                FtpWebResponse response = null;
                response = (FtpWebResponse) request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                LSOutput = reader.ReadToEnd();
                reader.Close();
                response.Close();

                PrepareLog("LS output while finding files:");
                PrepareLog(LSOutput);
                downloaded = true;
            }
            catch (Exception ex)
            {
                retries++;
            }
        }


        if (downloaded)
        {
            //Parse the LS
            string[] LSOutputLines = LSOutput.Trim().Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
            foreach (string LSOutputLine in LSOutputLines)
                files.Add(LSOutputLine);

            //Filter files
            files = files.Where(f => f.ToLower().EndsWith(extension.ToLower())).ToList();

            PrepareLogAndEmail("Total " + extension.ToLower() + " files found: " + files.Count, LogMessageType.Simple);
            return files;
        }
        else
        {
            PrepareLogAndEmail("Failed to download file", LogMessageType.Simple);
            return null;
        }
    }
相关问题