2013-07-18 2 views
0

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

나는, 재시도 루프 당신은 내가 성공적인 다운로드에서 플래그에 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; 
     } 
    } 
관련 문제