26

我想做的是类似于以下内容:

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
}

我不打算写入内存数据库,但在连接到它之前,我需要能够在我的程序的内存中对文件做一些事情。

4

2 回答 2

3

如果您不介意使用 Interop 并直接转到CreateFile()(然后将返回的 HANDLE 包装在 FileStream 中),您可以查看使用指定的 FILE_ATTRIBUTE_TEMPORARY 创建文件,只要有缓存内存可用,当它的句柄关闭时会自动删除文件。

如果有足够的高速缓存可用,指定 FILE_ATTRIBUTE_TEMPORARY 属性会导致文件系统避免将数据写回大容量存储,因为应用程序会在句柄关闭后删除临时文件。在这种情况下,系统可以完全避免写入数据。尽管它不像前面提到的标志那样直接控制数据缓存,但 FILE_ATTRIBUTE_TEMPORARY 属性确实告诉系统在不写入的情况下尽可能多地保存在系统缓存中,因此可能会引起某些应用程序的关注。

于 2011-06-06T19:48:37.237 回答
0

使用 Interop 和 CreateFile() 太复杂了。这是创建具有 FILE_ATTRIBUTE_TEMPORARY 属性的文件的简单方法,该属性将尽可能多地使用缓存:

var file = File.Create(path);
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Temporary);
于 2018-03-30T13:13:05.613 回答