gpt4 book ai didi

C - 在内存中创建文件

转载 作者:可可西里 更新时间:2023-11-01 12:21:25 25 4
gpt4 key购买 nike

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

我知道在 Linux 中您可以使用 fmemopen()。 win32有没有类似的解决方案?

最佳答案

fdopen 在 POSIX.1-1990 中,Windows 以 _fdopen 的形式支持它。将它与 _get_osfhandle_open_osfhandle 一起使用,它允许从与 C 标准库的其余部分一起使用的 Windows 文件 HANDLE 构建适当的 FILE *。有关此的更多信息,另请参阅问题 Is there a Windows equivalent to fdopen for HANDLEs?

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

  1. 创建一个临时文件;即非持久性。换句话说,将 CreateFile 与从 GetTempPath 构建的路径一起使用,也可能是 GetTempFileName

  2. ...设置了 FILE_ATTRIBUTE_TEMPORARY 文件属性 [1];即尽可能以内存为后盾。

  3. ...并设置 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]

Specifying the FILE_ATTRIBUTE_TEMPORARY attribute causes file systems to avoid writing data back to mass storage if sufficient cache memory is available, because an application deletes a temporary file after a handle is closed. In that case, the system can entirely avoid writing the data. Although it does not directly control data caching in the same way as the previously mentioned flags, the FILE_ATTRIBUTE_TEMPORARY attribute does tell the system to hold as much as possible in the system cache without writing and therefore may be of concern for certain applications.

[2]

The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.

[3]

Attempts to write more than size bytes to the buffer result in an error.

关于C - 在内存中创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com