Композитный Stream Wrapper, обеспечивающий частичную MemoryStream и полный оригинальный Stream

Кто-нибудь знает решение с составным потоком, которое предварительно загрузит первую часть потока в MemoryStream и сохранит оставшуюся часть в качестве исходного потока, к которому будет обращаться, когда последующие части потребуются по мере необходимости?

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

Я надеюсь, что это решение, которое кто-то мог решить раньше, возможно, для оптимизации производительности чтения большого FileStream.

В моем случае я пытаюсь обойти ошибку Windows Phone 8 при чтении больших файлов с SD-карты. Более подробная информация о проблеме, которую я пытаюсь обойти, приведена в этом ответе: /questions/11052937/problema-s-chteniem-fajla-na-sd-karte-windows-phone-8/11052950#11052950

1 ответ

Решение

Нет никакого разумного способа использовать MemoryStream, чтобы обойти эту ошибку, сначала вы получите исключение OutOfMemoryException. Давайте немного сосредоточимся на ошибке, я немного упросту код, чтобы сделать его читабельным:

DistanceToMove = (offset & 0xffffffff00000000L) >> 32;
DistanceToMoveHigh = offset & 0xffffffffL;
SetFilePointer(this.m_handle, lDistanceToMove, ref lDistanceToMoveHigh, begin);

Программист Microsoft случайно поменял местами низкие и высокие значения. Ну, так что вы можете исправить ошибку. Поменяйте их местами, чтобы ошибка поменяла их так, как вы этого хотите:

public static void SeekBugWorkaround(Stream stream, long offset, SeekOrigin origin) {
    ulong uoffset = (ulong)offset;
    ulong fix = ((uoffset & 0xffffffffL) << 32) | ((uoffset & 0xffffffff00000000L) >> 32);
    stream.Seek((long)fix, origin);
}

В случае, если это нужно сказать, это очевидно, что вы должны рассчитывать на то, что Microsoft в конечном итоге исправит эту ошибку. Сложно предсказать, когда начнутся азартные игры на следующем этапе релиза. Есть некоторые шансы, что вы можете автоматически определить это, хотя не совсем очевидно, что собирается делать Microsoft, так как эта ошибка настолько серьезна. Возвращаемое значение Seek(), а также возвращаемое значение свойства Position страдают от той же ошибки. Так что постарайтесь в позиции 1 и убедитесь, что вы получаете 1 обратно.

Другие вопросы по тегам