2013-04-03 4 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, да, хороший совет. (предполагая, что OP использует .Net> = 4) –

Смежные вопросы