我在这里用简单的C编写小程序。
我需要的是直接在内存中创建一个文件(不写在硬盘上)
目前我可以使用fopen("filename.txt,"wb")
写入文件。
我知道在linux中你可以使用fmemopen()
。 win32有类似的解决方案吗?
答案 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下接近这个。最常见的似乎是:
创建临时文件;即非持久性的。换句话说,将CreateFile
与GetTempPath
以及可能GetTempFileName
构建的路径一起使用。
... FILE_ATTRIBUTE_TEMPORARY
文件属性设置[1];即尽可能记忆备份。
...并设置FILE_FLAG_DELETE_ON_CLOSE
标志[2];即暗示它永远不需要写,除非它不适合记忆。
只要有足够的内存将文件保存在内存中(即内存压力足够低),就不会使用该磁盘。请参阅此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是:
完成后,不要忘记取消映射并关闭文件映射。