【问题标题】:Is it possible to open an anonymous file in windows?是否可以在 Windows 中打开匿名文件?
【发布时间】:2015-11-17 14:03:15
【问题描述】:

我想打开一个匿名文件,这是在 linux 下打开文件并取消链接或使用 memfd_create 的结果,但这些似乎在 windows 下都不可用(你可以 使删除文件起作用,但在文件关闭之前它的名称似乎不会被删除)。获取不支持文件系统中可见内容的文件描述符。

有没有办法在windows下实现这个?最好我希望它永远不会出现在文件系统中。

我想要这个的原因是因为我需要将 FILE* 作为参数发送给期望它的函数(并且我不希望它破坏文件系统)。更改库看起来不是一个可行的选择(除了这些库还必须在其他操作系统上工作 - 所以它们无论如何都不能依赖于 Windows 特定的抽象)。

【问题讨论】:

  • 我不知道为什么这被否决了,所以我不得不猜测如何改进这个问题:(
  • 如果 FILE * 仅被读取或写入,没有搜索,您可能可以为此使用命名管道。
  • @anatolyg 这是相关的,但那里的答案要么说它无法完成(接受的答案),要么提供依赖于 unix 行为或 GNU c-library 的解决方案。

标签: c windows file winapi


【解决方案1】:

Windows 中最接近memfd_create 的是内存映射文件。关于它的 MSDN 文章在这里:http://go.microsoft.com/fwlink/?linkid=180801

但基本上,CreateFileMapping/OpenFileMapping API 调用。

这不使用物理磁盘(除非它需要在磁盘上分页内存),但据我所知,memfd_create也没有

【讨论】:

  • 实际上我即将对其进行内存映射,所以这听起来很有希望,但据我所知,CreateFileMapping 返回(一个句柄)一个文件映射对象。好像不能对它做fx_open_osfhandle
  • 是的,我从来没有从内存映射文件创建一个 C 描述符,所以它在 Windows 中可能不可行(无论如何都不能使用 MMF),这就是我没有说的原因它是平等的,只是“相当接近”。您将获得一个可以与 Win32 API 一起使用的文件句柄,但不是 C 风格的描述符(或者您的评论似乎如此)
  • 呃……“虚拟内存”到底是什么? @skyking:读取documentation"hFile:如果hFile为INVALID_HANDLE_VALUE,调用进程还必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下,CreateFileMapping创建一个文件映射对象由系统页面文件而不是文件系统中的文件支持的指定大小。"
  • @IInspectable RAM 在磁盘上分页,抱歉,我脑子有点糊涂,我会编辑
  • @skyking:别再像 Unix 一样思考了。 不是一切都是文件,在一块内存上使用WriteFile 感觉就像 Unix-y,很痛。使用memcpy
【解决方案2】:

不,Windows 中不存在匿名文件。

(当然,这并不一定意味着您不能拥有一个满足您需要的FILE *;例如,我喜欢罗斯关于使用命名管道的建议。)

【讨论】:

  • 你有该声明的来源吗?
  • @anatolyg:也许可以创建一个可以满足 OP 需求的 FILE * 对象,但由于它实际上不是我支持的文件回答。但还应注意,您链接到的问题的大多数答案都不适用于 Windows,唯一适用的答案是仅输出。 (例如,我喜欢罗斯关于使用命名管道的建议。)
  • @skyking:作为一般规则,文档描述的是可能的,而不是不可能可能的,所以不,我不有一个规范的来源。 :-) 但如果发现并非如此,我会非常感到惊讶。
  • (并不是说有任何东西阻止第三方文件系统实现它们。但我假设您希望它在普通 Windows 系统上工作,即 NTFS。)
  • ... 还有各种奇怪的方法,例如 RAM 磁盘或影子卷。但是 IMO 与临时文件相比,它们更具侵入性,而不是更少。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2011-04-09
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多