В любую современную ОС встроена система кэширования, поэтому фактически, когда вы взаимодействуете с файлом, вы взаимодействуете с кэшем в памяти файла.
Перед применением пользовательского кэширования необходимо задать важный вопрос: что происходит при изменении базового файла, поэтому моя кэшированная копия становится недействительной?
Вы можете усложнить ситуацию, если разрешено изменять кэшированную копию, и изменения необходимо сохранить обратно в базовый файл.
Если файл небольшой, проще использовать MemoryStream
, как предлагается в другом ответе.
Если вам нужно сохранить изменения обратно в файл, вы можете написать класс-оболочку, который перенаправляет все в MemoryStream
, но дополнительно имеет свойство IsDirty, которое устанавливает его в true при выполнении операции записи. Затем вы можете получить некоторый управляющий код, который активируется всякий раз, когда вы выбираете (в конце какой-то более крупной транзакции?), Проверяет (IsDirty == true)
и сохраняет новую версию на диск. Это называется кэшированием с отложенной записью, поскольку изменения вносятся в память и фактически не сохраняются до некоторого времени позже.
Если вы действительно хотите усложнить задачу или у вас очень большой файл, вы можете реализовать свою собственную подкачку страниц, где вы выбираете размер буфера (возможно, 1 МБ?) И удерживаете небольшое количество byte[]
страниц этого исправленный размер. На этот раз у вас будет грязный флаг для каждой страницы. Вы бы реализовали методы Stream, чтобы они скрывали детали от вызывающей стороны и при необходимости вставляли (или отбрасывали) буферы страниц.
Наконец, если вы хотите облегчить жизнь, попробуйте:
http://www.microsoft.com/Sqlserver/2005/en/us/compact.aspx
Он позволяет вам использовать тот же механизм SQL, что и SQL Server, но в файле, причем все происходит внутри вашего процесса, а не через внешний сервер RDBMS. Это, вероятно, даст вам гораздо более простой способ запрашивать и обновлять ваш файл и избежать необходимости большого количества рукописного постоянного кода.