2013-04-03 7 views
0

FTP 서버에서 파일을 다운로드하고 있습니다. 마지막 바이트가되면 고정되고 시간이 초과됩니다. 시간 제한을 -1로 설정해야만 시간이 초과되지 않지만 마지막 바이트는 끝나지 않습니다.C# FTP 파일 다운로드 시간 초과

아이디어가 있으십니까?

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://xxx" + "/" + fileDownload); 
      request.Credentials = new NetworkCredential("xxx", "xxx"); 
      request.UseBinary = true; 
      request.KeepAlive = true; 

      request.Timeout = -1; 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

      Stream responseStream = response.GetResponseStream(); 
      FileStream writer = File.Create(@"c:\temp\" + Path.GetFileNameWithoutExtension(fileDownload) + ".csv"); 


      long length = response.ContentLength; 
      int bufferSize = 2048; 
      int readCount; 
      byte[] buffer = new byte[2048]; 

      // readCount = responseStream.Read(buffer, 0, bufferSize); 

      while (responseStream.CanRead) 
      { 
       readCount = responseStream.Read(buffer, 0, bufferSize); 
       writer.Write(buffer, 0, readCount); 

      }  
      responseStream.Close(); 
      response.Close(); 

      writer.Close(); 

답변

0

CanRead 당신이 생각하는대로하지 않습니다. 실제로 스트림이 에서 모두 읽힐 수 있는지 여부를 나타냅니다.. 남아있는 바이트가 있는지 여부가 아닙니다. 대신 루프를 다음과 같이 다시 작성하십시오.

for (int readCount; (readCount = responseStream.Read(buffer, 0, bufferSize)) > 0;) 
{ 
    writer.Write(buffer, 0, readCount); 
} 
+0

지금 사용해보세요. Filezilla를 사용하여 작업을 완료했으며 약 3000 바이트가 누락되었습니다. 나는 그것이 효과가 있기를 바란다. 감사. –

+0

또한 정말로 버퍼링 할 필요가없는 한. 당신은 간단하게'responseStream.CopyTo (writer);' – tidwall

+0

@jojaba, yes, good advice를 할 수있다. (OP가 .Net> = 4를 사용한다고 가정) –