2

我有一个只能处理文件的第 3 方库,即使用“file:///path/path/file.ext”之类的文件名 URL 引用。但是我已经有一些我想从内存中读取的数据。

是否可以使内存缓冲区看起来像一个文件,即具有文件名,所以我可以省略将内存缓冲区写入磁盘的步骤,以便第 3 方库可以处理它?

谢谢

编辑:我添加了一些代码来演示我想做的事情:

const char* gFileName = "/Users/matthew.davies/Hello";

void MakeMemoryFile (const char* filename, const char* buffer, size_t size)
{

}

void DeleteMemoryFile (const char* filename)
{

}

int main()
{
    const char* buffer = "Hello World!";
    FILE* f;
    char outBuffer [13];


    MakeMemoryFile(gFileName, buffer, strlen(buffer));

    f = fopen(gFileName, "rb");
    outBuffer[12] = 0;
    fread(outBuffer, 12, 1, f);
    fclose(f);
    DeleteMemoryFile(gFileName);

    return 0;
}

MakeMemoryFile() 将创建该文件,以便以后可以使用 fopen 按名称引用它。

4

2 回答 2

0

一种可能的方法是创建一个tmpfs(内存中的临时文件系统)并将数据写入到mmap()ed 缓冲区,尽管第一步需要 root 权限,而且这种情况有点过于复杂。

另一种可能的方法是滚动一个微型自定义 FUSE 文件系统,它将某些程序的内存区域作为文件公开(您需要将此 FS 集成到程序中并将 FUSE 添加到程序的依赖项中)。

此外,Linux 会进行积极的磁盘缓存,因此对于不是非常大的文件,将其留给内核可能会更好。例如,Vim 可以很好地处理大型标签文件(~100Mb)而无需显式缓存。

于 2012-10-19T16:04:45.107 回答
0

如果它是像 OS 一样的 unix,如何使用 mmap() 系统调用来使用内存映射文件。

于 2012-10-19T15:49:57.183 回答