В C # есть ли способ связать файл в памяти как базу данных SQLite в памяти с System.Data.SQLite? - PullRequest
26 голосов
/ 31 мая 2011

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

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
}

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

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

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

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

0 голосов
/ 30 марта 2018

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

var file = File.Create(path);
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Temporary);
...