2010-06-18 1 views
0

Мое приложение загружает огромные файлы, используя HttpWebRequest -> WebResponse -> Stream -> FileStream. См. Код ниже.Загрузка файлов. Проблемы с сетью приводят к поврежденным файлам

С следующий сценарий, который мы всегда получаем поврежденные файлы:

  1. Начало загрузки.
  2. Отсоедините кабель или нажмите, чтобы приостановить процесс загрузки.
  3. Закройте и откройте приложение.
  4. Начало загрузки (начинается с точки прерывания).
  5. Ждут загрузка полного файла.

Проблема: загруженный файл поврежден.

Я уверен, что это обычная проблема, но я не смог выполнить поиск в Google или SOG. Пожалуйста, порекомендуйте. Что может быть причиной?

public class Downloader 
{ 
    int StartPosition { get; set; } 
    int EndPosition { get; set; } 
    bool Cancelling { get; set; } 

    void Download(string[] args) 
    { 
     string uri = @"http://www.example.com/hugefile.zip"; 
     string localFile = @"c:\hugefile.zip"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.AddRange(this.StartPosition); 
     WebResponse response = request.GetResponse(); 
     Stream inputStream = response.GetResponseStream(); 

     using (FileStream fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Write)) 
     { 
      int buffSize = 8192; 
      byte[] buffer = new byte[buffSize]; 
      int readSize; 

      do 
      { 
       // reads the buffer from input stream 
       readSize = inputStream.Read(buffer, 0, buffSize); 

       fileStream.Position = this.StartPosition; 
       fileStream.Write(buffer, 0, (int)readSize); 
       fileStream.Flush(); 

       // increase the start position 
       this.StartPosition += readSize; 

       // check if the stream has reached its end 
       if (this.EndPosition > 0 && this.StartPosition >= this.EndPosition) 
       { 
        this.StartPosition = this.EndPosition; 
        break; 
       } 

       // check if the user have requested to pause the download 
       if (this.Cancelling) 
       { 
        break; 
       } 
      } 
      while (readSize > 0); 
     } 
    } 
} 
+0

Когда вы сравниваете 2 файла, каковы различия? Загружен ли какой-либо раздел? Имеет ли он дублированный раздел или имеет неправильный раздел? –

+0

Ничего себе! Я должен был сделать это сначала, прежде чем задавать вопрос. Файлы двоичные. Как сделать сравнение двух двоичных файлов? –

+0

Пробная версия Beyond Compare должна делать то, что вам нужно. –

ответ

1

Чтобы устранить эту проблему, я предложил бы сравнить файл, чтобы определить, каковы различия. Загружен ли какой-либо раздел? Имеет ли он дублированный раздел или имеет неправильный раздел?

+0

Инструмент Beyond Compare показал, что сервер был сломан, не поддерживается заголовок Accept-Ranges. Спасибо, Мартин! –

1

Вызов AddRange() неверен, вы хотите передать отрицательное значение, чтобы получить оставшуюся часть файла. Из статьи библиотеки MSDN:

Если диапазон положительный, диапазон находится от начала данных до диапазона.
Если диапазон отрицательный, диапазон находится от диапазона до конца данных.

Я не вижу, как инициализируется EndPosition, что также может быть неправильным.

+0

Я знаю об этой проблеме, и я обрабатываю ее в реальном коде. Код здесь не является реальным. Он лишен. Благодарю. –

+0

Не знаю, что это значит. Но вызов AddRange определенно неверен и объясняет коррупцию. –

+0

Я использую это обходное решение: http://www.codeguru.com/forum/showthread.php?t=467570 –