Прочитайте файл с отображением памяти или зная его размер, чтобы прочитать его исправно

В этом вопросе

Прочитайте все содержимое файла с отображением памяти или Memory Mapped View Accessor, не зная его размера

есть проблема, (int)stream.Length не дает мне правильную длину, она скорее дает размер используемого внутреннего буфера! Мне нужно обновить этот вопрос, потому что это очень важно.

Главный вопрос:

Мне нужно что-то похожее на ReadToEnd или ReadAllBytes, чтобы читать все содержимое MemoryMappedFile с помощью MappedViewAccessor, если я не знаю его размера, как я могу это сделать?

Я искал его, я видел этот вопрос, но это не вещь, которую я ищу:

Как быстро прочитать байты из файла с отображением памяти в .NET?

Старый ответ:

пабе

public static ReadMMFAllBytes(string fileName)
{
    using (var mmf = MemoryMappedFile.OpenExisting(fileName))
    {
        using (var stream = mmf.CreateViewStream())
        {
            using (BinaryReader binReader = new BinaryReader(stream))
            {
                return binReader.ReadBytes((int)stream.Length));
            }
        }
    }
}

В этом вопросе:

Длина файла с отображением памяти

Нет точного ответа на точный вопрос! вопрос касается чего-то другого, кроме названия.

Ответ 1

Лучший подход - сначала отправить заголовок фиксированной длины, а не просто передавать необработанные байты. Таким образом, первый blob, который вы читаете, является согласованной длиной, и он дает вам информацию, необходимую для чтения остатка переменной длины.

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