Скачивание файлов. Проблемы с сетью приводят к повреждению файлов - PullRequest
0 голосов
/ 18 июня 2010

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

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

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

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

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

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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 18 июня 2010

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

1 голос
/ 18 июня 2010

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

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

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

...