C - 在内存中创建文件

时间:2012-09-03 14:17:55

标签: c windows

我在这里用简单的C编写小程序。 我需要的是直接在内存中创建一个文件(不写在硬盘上) 目前我可以使用fopen("filename.txt,"wb")写入文件。

我知道在linux中你可以使用fmemopen()。 win32有类似的解决方案吗?

4 个答案:

答案 0 :(得分:6)

fdopen位于POSIX.1-1990中,Windows以_fdopen的形式支持它。与_get_osfhandle_open_osfhandle一起使用时,它允许从与其他C标准库一起使用的Windows文件FILE *构建正确的HANDLE。有关此问题的详细信息,另请参阅问题Is there a Windows equivalent to fdopen for HANDLEs?

现在,问题的其余部分是创建内存支持的Windows文件。事实证明,有不同的方法,在NT下接近这个。最常见的似乎是:

  1. 创建临时文件;即非持久性的。换句话说,将CreateFileGetTempPath以及可能GetTempFileName构建的路径一起使用。

  2. ... FILE_ATTRIBUTE_TEMPORARY文件属性设置[1];即尽可能记忆备份。

  3. ...并设置FILE_FLAG_DELETE_ON_CLOSE标志[2];即暗示它永远不需要写,除非它不适合记忆。

  4. 只要有足够的内存将文件保存在内存中(即内存压力足够低),就不会使用该磁盘。请参阅此MSDN blogpost from Larry Osterman,其中介绍了此方法。有趣的是,他称这些文件是"临时的"临时文件

    请注意,这不是完全等同于fmemopen,如果文件不适合预定义的内存区域[3],它将失败(即fmemopen设置纯内存支持的文件)。但是,出于许多目的,它足够接近(有时可能需要磁盘上的潜在支持)。

    此外,请参阅How to prevent flushing to disk of a memory map opened on a windows temporary delete-on-close file讨论有关这些文件属性和其他可能方法的一些讨论。

    最后,对于结合两个部分的完整示例(即创建内存支持的文件,然后将其包装在FILE *句柄中),请查看fmem library中的实现(这是为了解决这个问题而编写的,或者来自libconfuse library的那个。

    [1]

      

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

    [2]

      

    文件将在所有句柄关闭后立即删除,包括指定的句柄和任何其他打开或重复的句柄。

    [3]

      

    尝试向缓冲区写入大于字节的字节会导致错误。

答案 1 :(得分:1)

Windows中本质上不支持此类功能。但是,您可以重写高级stdio函数来访问内存缓冲区而不是文件,或者只是实现类似stdio的函数。或者您可以实现RAM disk,但安装RAM磁盘驱动程序本身可能不符合您的#34;不要写入磁盘"规则。

答案 2 :(得分:0)

我不会使用fopen,因为这会创建一个文件。

要在内存中创建文件,您需要创建文件并以您认为合适的方式存储它。

您需要创建一些数据类型的数组。我会使用char *但你可以使用任何你想要编码的信息。然后,您可以通过向数组添加信息来读取和写入文件。

答案 3 :(得分:0)

你可以通过MapViewOfFile实现目标。 您应该使用的Win32 API是:

  

CreateFile(...)

     

CreateFileMapping(...)

     

MapViewOfFile(...)

完成后,不要忘记取消映射并关闭文件映射。