2010-07-26 6 views
2

ftp 서버에서 파일을 다운로드하기 전에 존재하지 않거나 없으면 확인하고 싶다면 mu st 예외가 발생했는지 확인하고 싶습니다. 코드 샘플은 파일이 없을 때 작동합니다. 그러나 파일이 존재하면 행을 실행 한 후; "ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;" 두 번째 catch 블록을 건너 뛰고 "오류 : 요청을 제출하면이 작업을 수행 할 수 없습니다."라는 메시지가 인쇄됩니다. 내가 볼 수없는 요점은 뭐야 .. 대답 해줘서 고마워.파일을 다운로드하기 전에 FTP 서버에 파일이 있는지 여부를 확인하십시오.

public void fileDownload(string fileName) 
     { 
      stream = new FileStream(filePath + fileName, FileMode.Create); 
      ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath + fileName)); 
      ftpRequest.Credentials = new NetworkCredential(userName, password); 
      ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize; 

      try 
      { 
       response = (FtpWebResponse)ftpRequest.GetResponse(); 
       ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; 
       ftpRequest.UseBinary = true; 
       response = (FtpWebResponse)ftpRequest.GetResponse(); 
       ftpStream = response.GetResponseStream(); 
       cl = response.ContentLength; 
       bufferSize = 2048; 
       buffer = new byte[bufferSize]; 
       readCount = ftpStream.Read(buffer, 0, bufferSize); 

       while (readCount > 0) 
       { 
        stream.Write(buffer, 0, readCount); 
        readCount = ftpStream.Read(buffer, 0, bufferSize); 
       } 

       ftpStream.Close(); 
       stream.Close(); 
       response.Close(); 
       Console.WriteLine("File : " + fileName + " is downloaded from ftp server"); 
      } 
      catch (WebException ex) 
      { 
       FtpWebResponse res = (FtpWebResponse)ex.Response; 
       if (res.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) 
       { 
        stream.Close(); 
        File.Delete(filePath + fileName); 
        Console.WriteLine("File : " + fileName + " does not exists on ftp server"); 
        System.Diagnostics.Debug.WriteLine("Error: " + fileName + " is not available on fpt server"); 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine("Error: " + ex.Message); 
      } 
     } 

답변

2

제 생각에 요청할 때마다 FtpWebRequest을 새로 만들어야합니다. 따라서 Method을 다시 설정하기 전에 새 인증서를 만들고 자격 증명을 다시 설정해야합니다. 당신이 FTP 서버에 연결할 때

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath + fileName)); 
ftpRequest.Credentials = new NetworkCredential(userName, password); 
+0

네, 맞습니다. 같은 줄을 반복하지 않기 위해 fileExist() 메서드를 작성하여 처리했습니다. 그리고 그것은 응답을위한 덕분에 – anarhikos

+0

나는 동일한 오류가 : "이 작업은 요청이 제출 된 후에 수행 할 수 없습니다." 파일을 다운로드하고 같은 요청 개체를 다시 사용하여 다른 파일을 업로드하려고했습니다. 분리 된 요청 객체로 그들을 속이는 것이 트릭을 만들었습니다. 감사. – MikeTeeVee

0

당신이 번역 "FTP // ftp.domain.com/놓자"로 URI를 지정하고 있습니다 다음 두 줄을 반복해야 할 거라고 그래서 거의 ~ : "ftp://ftp.domain.com/homedirectoryforftp/somedirectory". 전체 루트 디렉토리를 정의하려면 컴퓨터의 // somedirectory로 변환되는 "ftp://ftp.domain.com//somedirectory"를 사용하십시오.

관련 문제