2010-09-12 3 views
-2

Я загружаю части файла (изображение), а затем я хочу сохранить эти части в один файл.Проблема с сегментированным файлом написать

Проблема в том, что первая часть загружается и сохраняется должным образом (я могу видеть часть этой ухищрения). Но, когда вторая часть сохраняется (FileMode.Append), изображение кажется сломанным.

Вот код:

HttpWebRequest webRequest; 
    HttpWebResponse webResponse; 
    Stream responseStream; 
    long StartPosition, EndPosition; 

     if (File.Exists(LocalPath)) 
      fileStream = new FileStream(LocalPath, FileMode.Append); 
     else fileStream = new FileStream(LocalPath, FileMode.Create); 

     webRequest = (HttpWebRequest)WebRequest.Create(FileURL); 

     webResponse = (HttpWebResponse)webRequest.GetResponse(); 
     responseStream = webResponse.GetResponseStream(); 

     StartPosition = 0; //download first 52062 bytes of the file 
     EndPosition = 52061; 

     webRequest.AddRange(StartPosition, EndPosition); 

     int SeekPosition = (int)StartPosition; 

     while ((bytesSize = responseStream.Read(Buffer, 0, Buffer.Length)) > 0) 
     { 
      lock (fileStream) 
      { 
       fileStream.Seek(SeekPosition, SeekOrigin.Begin); 
       fileStream.Write(Buffer,0, bytesSize); 
      } 

    //the Buffer.Length is 2048. 
    //When the bytes count to download is < 2048 then I decrease the Buffer.Length 
    //to prevent downloading more that 52062 bytes. 

      DownloadedBytesCount += bytesSize; 
      SeekPosition += bytesSize; 

      long TotalToDownload = EndPosition - StartPosition; 

      long bytesLeft = TotalToDownload - DownloadedBytesCount; 

      if (bytesLeft < Buffer.Length) 
       Buffer = new byte[bytesLeft]; 
     } 

, когда я хочу, чтобы загрузить вторую часть файла я поставил

StartPosition = 52062; 
    EndPosition = 104122; 

, а затем есть проблема, которую я описал выше. Почему файл не установлен правильно?

+0

Что означает «кажется сломанным»? Не используйте FileMode.Append. –

+0

Когда я пытаюсь открыть эту картинку после записи второй части, я не вижу ее содержимого. – Tony

+1

Ваш код настолько ошибочен, что я даже не знаю с чего начать. Зачем вам загружать файл по частям? – dtb

ответ

2

Вам не нужно StartPosition, fileStream.Seek() и Buffer = new byte[bytesLeft];

Также lock() не должно быть необходимым (если у вас есть гораздо больше неприятностей).

Так что удалите все это из-за того, что у вас есть что-то из этого неправильно.

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

  • Вы можете проверить с помощью отладчика, если цикл загрузки выполняется вообще.
  • Как осуществляется переход на 2-й диапазон 52k - 104k
  • , как долго получается итоговый файл в конце?
  • содержит ли файл первые 52k байтов или вторую загрузку?
  • и т.д.

Все, что имеет значение, и мы не должны догадаться.

+0

Мне нужна операция поиска и блокировка, потому что к локальному файлу будут доступны многие потоки. Я видел, что - что странно - вторая часть файла имеет первые 4096 байт в качестве первой части.Я знаю, что сервер поддерживает заголовок Range, потому что первая часть загружена правильно. – Tony

+1

Если вы действительно используете FileStream (not: file) в разных потоках, вы не можете использовать режим Append. –

+0

Итак, я могу изменить его на FileMode.Open – Tony

0

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

0

Этого кода злой. .. извините, но вы должны начать с удаления всего кода и поиска своей проблемы с самого начала. Есть много лучших способов выполнить то, что вы хотите. Просто взгляните на некоторые хорошие решения:
http://www.codeproject.com/KB/IP/MyDownloader.aspx

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