Я хочу сделать что-то вроде следующего:
using System.Data.SQLite;
using System.IO;
//My SQLite connection
SQLiteConnection myCon;
public void ReadAndOpenDB(string filename)
{
FileStream fstrm = new FileStream(filename, FileMode.Open);
byte[] buf = new byte[fstrm.Length];
fstrm.Read(buf, 0, (int)fstrm.Length);
MemoryStream mstrm = new MemoryStream(buf);
//Do some things with the memory stream
myCon = new SQLiteConnection(/*attach to my memory stream for reading*/);
myCon.Open();
//Do necessary DB operations
}
Я не планирую писать в БД в памяти, но мне нужно иметь возможность делать некоторые вещи с файлом, в памяти в моей программе перед подключением к ней.
Использование Interop и CreateFile () слишком сложно. Вот простой способ создать файл с атрибутом FILE_ATTRIBUTE_TEMPORARY, который будет максимально использовать кэш-память:
var file = File.Create(path);
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Temporary);
Если вы не возражаете против использования Interop и перехода к CreateFile () напрямую (затем оборачиваете возвращенный HANDLE в FileStream), вы можете взглянуть на создание файла с указанным FILE_ATTRIBUTE_TEMPORARY, который не будет записывать файл на диск, если есть доступная кэш-память, которая автоматически удалит файл, когда его дескриптор будет закрыт.
Указание атрибута FILE_ATTRIBUTE_TEMPORARY заставляет файловые системы избегать записи данных обратно в запоминающее устройство, если доступно достаточное количество кэш-памяти, поскольку приложение удаляет временный файл после закрытия дескриптора. В этом случае система может полностью избежать записи данных. Хотя он напрямую не управляет кэшированием данных так же, как ранее упомянутые флаги, атрибут FILE_ATTRIBUTE_TEMPORARY сообщает системе как можно больше хранить в системном кэше без записи и, следовательно, может представлять интерес для определенных приложений.