В C # есть ли любым способом связать файл в памяти как базу данных SQLite в памяти с помощью System.Data.SQLite?

Я хочу сделать что-то вроде следующего:

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
}

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

26
задан Mike Webb 31 May 2011 в 17:22
поделиться

2 ответа

Использование Interop и CreateFile () слишком сложно. Вот простой способ создать файл с атрибутом FILE_ATTRIBUTE_TEMPORARY, который будет максимально использовать кэш-память:

var file = File.Create(path);
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Temporary);
0
ответ дан 28 November 2019 в 17:31
поделиться

Если вы не возражаете против использования Interop и перехода к CreateFile () напрямую (затем оборачиваете возвращенный HANDLE в FileStream), вы можете взглянуть на создание файла с указанным FILE_ATTRIBUTE_TEMPORARY, который не будет записывать файл на диск, если есть доступная кэш-память, которая автоматически удалит файл, когда его дескриптор будет закрыт.

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

3
ответ дан 28 November 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: