2014-10-05 2 views
2

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

/// <summary> 
    /// Gibt die Bytesequenz des angeforderten Chunks zurück 
    /// </summary> 
    /// <param name="chunkNumber">Die Position des Chunks im Array</param> 
    /// <returns>Die Bytesequenz des angeforderten Chunks</returns> 
    byte[] FileToChunk(int chunkNumber) 
    { 
     byte[] chunkBuffer = new byte[chunkSize]; 
     FileStream fileStream = new 
      FileStream("C:\\Users\\Patrick\\Downloads\\Prog\\UnityAssets\\start.unitypackage" 
           , FileMode.Open 
           , FileAccess.Read 
          ); 
     fileStream.Seek((chunkNumber - 1) * chunkSize, SeekOrigin.Begin); 
     while (fileStream.Read(chunkBuffer, 0, chunkBuffer.Length) > 0); 
     if ( fileStream.Position != fileStream.Length 
      && fileStream.Position != fileStream.Position - 1 
      ) 
       fileStream.Close(); 
     return chunkBuffer; 
    } 

Таким образом, количество фрагмента, который должен быть извлечен передаются в качестве аргумента, и с fileStream.Seek() Я хочу позицию фрагмента, который задан. Как я уже сказал, первый вызов этого метода возвращает, вероятно, рабочий кусок, но все остальные вызовы возвращают Byte[] - массивы, заполненные 0. chunkSize - 256 КБ (1024 * 256 байт), а файл, который я хочу прочитать, имеет размер ~ 11 МБ (= 11000 КБ), поэтому его необходимо разбить на (int)Math.Ceiling((double)(file.fileSize/chunkSize)).

Что я делаю неправильно?

ответ

1

В соответствии с документацией FileStream.Read возвращает количество прочитанных байтов. Таким образом, следующий цикл:

while (fileStream.Read(chunkBuffer, 0, chunkBuffer.Length) > 0); 

будет работать до конца потока. Для того, чтобы прочитать кусок вы хотите, вы должны вызвать метод только один раз:

fileStream.Read(chunkBuffer, 0, chunkBuffer.Length); 

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