Объединить несколько файловых потоков в один файл?

У меня есть приложение, в котором я довольно быстро сохраняю большое количество двоичных данных. В настоящее время у меня есть два разных канала данных, размер которых может увеличиваться независимо, поэтому я храню их в двух файлах. Однако эти два файла тесно связаны друг с другом (ссылки на идентификаторы имеют смысл только в контексте другого файла), поэтому было бы предпочтительнее для целей транспортировки и правильной связи хранить/переносить их как один файл. файл.

Существует ли какой-либо стандартный способ на уровне ОС или в .NET BCL для создания двух объектов FileStream, которые могут независимо расти в одном и том же базовом файле?

Я рассматривал возможность реализации какой-то схемы разбивки/разбиения на страницы, но мне кажется, что это в основном дублирует то, что файловая система уже делает под капотом, поэтому я бы предпочел, чтобы файловая система управляла этим, если это возможно.

Другой альтернативой является использование инструмента постобработки для объединения двух файлов после завершения записи. Это управляемо, но не идеально.

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

Идеальным решением этой проблемы было бы масштабирование до более чем двух потоков данных в одном файле, хотя для моих текущих целей и двух было бы достаточно.


person Dan Bryant    schedule 09.02.2015    source источник
comment
Нужна ли вам какая-либо структура в окончательном файле, я имею в виду, что после закрытия двух потоков вам нужно что-нибудь, кроме вашей программы, которую вы можете изменить в соответствии с форматом файла, чтобы открыть файл? Скажем, у вас есть чанк 1 + чанк 2, может ли допустимое хранилище быть чем-то вроде zip-файла, или вам нужно, чтобы они были побайтно в конечном файле, сначала чанк 1, затем чанк 2.   -  person Lasse V. Karlsen    schedule 09.02.2015
comment
Как это должно работать? Где новые байты записываются в один файл? Какой-то пейджинг?   -  person DrKoch    schedule 09.02.2015
comment
Существует Структурированное хранилище COM — я использую его в одном из своих продуктов для хранения нескольких взаимосвязанных потоки данных в один физический файл. Однако это несколько устаревшая технология, и ее использование с C# может быть немного неудобным. Я не уверен, есть ли эквивалент на основе .NET.   -  person 500 - Internal Server Error    schedule 09.02.2015
comment
@ LasseV.Karlsen, я гибко подхожу к структуре, и только моей программе нужно открыть файл. Оба файла в настоящее время отформатированы с использованием Protobuf.net для сериализации серии двоичных записей, которым предшествует запись заголовка с некоторой информацией о версии.   -  person Dan Bryant    schedule 09.02.2015
comment
Я тоже собирался предложить взглянуть на структурированное хранилище и поделиться теми же мыслями о том, что оно устарело и может не иметь хорошей реализации .NET. Я просмотрел несколько, но не нашел ни одной реализации, которая выглядела бы хорошо.   -  person Lasse V. Karlsen    schedule 09.02.2015
comment
Если вы используете NTFS, Альтернативные потоки данных звучит как (плохо) возможность. (Часто задаваемые вопросы)   -  person HABO    schedule 09.02.2015


Ответы (2)


Если вы просто хочу, чтобы это выглядело как один файл.

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

person Alexei Levenkov    schedule 09.02.2015

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

using(var z = new ZipFile())
{
    z.AddEntry("file1", (name, stream) => 
    {
        someSourceStream1.CopyTo(stream);
    });
    z.AddEntry("file2", (name, stream) => 
    {
        someSourceStream2.CopyTo(stream);
    });
    z.Save(@"some\path.zip");
    //or
    //z.Save(someOutputStream);
}
person spender    schedule 09.02.2015