2012-10-19 39 views
2

我有一个第三方库只能处理文件,即使用像“file:///path/path/file.ext”这样的文件名称URL引用。但是我有一些数据我想从内存中读取。UNIX中的基于内存的文件

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

感谢

编辑:我添加了一些代码演示我想该怎么做:

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。

+0

您可以创建从脚本获取其数据的字符设备。我知道你可以在Perl中创建类似的东西。 –

回答

0

如果使用内存映射文件使用mmap()系统调用,如果它是像操作系统一样的unix,那么该怎么办?

+0

因为它需要由文件名参考。 – Cthutu

+0

您可以将与文件相关的文件描述符指定为mmap()参数,并使用从mmap获取的指针作为“缓冲区”。 –

+0

但我可以用fopen()打开那个缓冲区吗?第三方库需要一个文件名。我只能通过文件名访问我的内存缓冲区。 – Cthutu

0

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

另一种可能的方法是滚动一个小的定制FUSE文件系统,将某些程序的内存区域公开为文件(您需要将此FS集成到程序中并将FUSE添加到程序的依赖项中)。另外,Linux会进行积极的磁盘缓存,所以对于不是一个非常庞大的文件,将其留给内核可能是件好事。例如,Vim很好地处理大标签文件(〜100Mb),而没有显式缓存。

+0

不幸的是,这是为了让iOS操作系统解决AVFoundation需要文件名的问题,但我已经在内存中存储了数据。 – Cthutu