Почему этот код чтения фрагментов не работает?

Я не знаю почему, но моя загрузка по частям не работает. Первый прочитанный фрагмент, вероятно, правильный, но следующие фрагменты содержат только 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)) частей.

Что я делаю не так?


person user3698624    schedule 05.10.2014    source источник


Ответы (1)


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

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

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

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

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

person BartoszKP    schedule 05.10.2014