23

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

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

4

4 回答 4

16

fdopen在 POSIX.1-1990 中,Windows 以_fdopen. 将它与_get_osfhandleand一起使用,它允许从 Windows 文件_open_osfhandle构建一个与 C 标准库的其余部分一起使用的正确文件。另请参阅问题是否有与 fdopen 等效的 Windows 用于 HANDLE?有关这方面的更多信息。FILE *HANDLE

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

  1. 创建临时文件;即非持久性。换句话说,使用从和可能CreateFile构建的路径。GetTempPathGetTempFileName

  2. ...具有FILE_ATTRIBUTE_TEMPORARY文件属性集 [1];即尽可能多地支持内存。

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

只要有足够的内存将文件保存在内存中(即内存压力足够低),磁盘就不会被使用。请参阅Larry Osterman的这篇MSDN 博客文章,其中描述了这种方法。有趣的是,他称这些文件为“临时”临时文件

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

此外,有关这些文件属性和其他可能方法的一些讨论,请参阅如何防止在 Windows 临时删除关闭文件上打开的内存映射刷新到磁盘讨论。

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


[1]

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

[2]

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

[3]

尝试将超过 size 字节写入缓冲区会导致错误。

于 2018-04-29T13:59:12.917 回答
1

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

于 2012-09-03T15:01:05.223 回答
1

您可以使用 MapViewOfFile 实现一些接近的目标。您应该为此使用的 Win32 API 是:

创建文件(...)

创建文件映射(...)

MapViewOfFile(...)

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

于 2012-09-03T14:32:38.747 回答
0

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

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

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

于 2012-09-03T14:22:33.753 回答