问题描述
|
我想做的事情大致如下:
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,(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()(然后将返回的HANDLE包裹在FileStream中),则可以查看使用指定的FILE_ATTRIBUTE_TEMPORARY创建文件,只要该文件不会将文件写入磁盘是高速缓存可用,当其句柄关闭时,它将自动删除文件。
指定FILE_ATTRIBUTE_TEMPORARY属性会使文件系统避免在有足够的高速缓存可用的情况下将数据写回大容量存储,因为在关闭句柄之后,应用程序会删除临时文件。在这种情况下,系统可以完全避免写入数据。尽管FILE_ATTRIBUTE_TEMPORARY属性没有以与前面提到的标志相同的方式直接控制数据缓存,但它确实告诉系统在不写入的情况下将其尽可能多地保留在系统缓存中,因此对于某些应用程序可能会引起关注。
, 使用Interop和CreateFile()太复杂了。这是使用FILE_ATTRIBUTE_TEMPORARY属性创建文件的简单方法,该属性将尽可能多地使用缓存:
var file = File.Create(path);
File.SetAttributes(path,File.GetAttributes(path) | FileAttributes.Temporary);