C - 在内存中创建文件

J N*_*ash 17 c windows

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

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

Aco*_*orn 9

fdopen在POSIX.1-1990中,Windows支持它的形式_fdopen.使用它_get_osfhandle_open_osfhandle,它允许FILE *HANDLE与其他C标准库一起使用的Windows文件构建一个正确的.另请参阅问题是否存在等效于HANDLEs的fdopen的Windows?有关这方面的更多信息.

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

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

  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]

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


Ken*_*Man 0

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

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

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