Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可以在windows中打开匿名文件吗?_C_Windows_File_Winapi - Fatal编程技术网

C 可以在windows中打开匿名文件吗?

C 可以在windows中打开匿名文件吗?,c,windows,file,winapi,C,Windows,File,Winapi,我想打开一个匿名文件,这是在linux下打开一个文件或使用memfd_create取消链接的结果,但在windows下这些似乎都不可用(您可以使删除文件起作用,但在关闭文件之前,它的名称似乎不会被删除)。获取一个文件描述符,该描述符没有在文件系统中可见的内容作为支持 有没有办法在windows下实现这一点?我希望它永远不会出现在文件系统中 我之所以希望这样做,是因为我需要一个文件*作为一个参数发送给一个需要它的函数(我不希望它破坏文件系统)。更改库看起来不是一个可行的选择(此外,库也必须在其他操

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

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


我之所以希望这样做,是因为我需要一个
文件*
作为一个参数发送给一个需要它的函数(我不希望它破坏文件系统)。更改库看起来不是一个可行的选择(此外,库也必须在其他操作系统上工作-因此它们无论如何都不能依赖于windows特定的抽象)。

在windows中最接近
memfd\u create
的是内存映射文件。MSDN关于它的文章如下:

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


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

不,Windows中没有匿名文件


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

实际上,我正要对它进行内存映射,所以这听起来很有希望,但就我所见,
CreateFileMapping
返回(一个句柄)一个文件映射对象。似乎不可能在它上面做fx
\u open\u osfhandle
。是的,我从来没有从内存映射文件中创建过一个C描述符,所以它在Windows中可能不可行(无论如何也不能使用MMFs),这就是为什么我没有说它是相等的,只是“相当接近”。您得到了一个可以与Win32 API一起使用的文件句柄,但不是一个C风格的描述符(或者您的评论似乎是这样的)嗯。。。“虚拟内存”到底是什么@天空之王:请阅读:“hFile:如果hFile是无效的\u HANDLE\u值,则调用进程还必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定文件映射对象的大小。在此场景中,CreateFileMapping创建指定大小的文件映射对象,该对象由系统分页文件支持,而不是由文件系统中的文件支持。“@IInspectable RAM在磁盘上翻页,很抱歉,我的头脑有点模糊,我会edit@skyking当前位置停止像Unix头脑一样思考。并不是所有的东西都是一个文件,在一块内存上使用
WriteFile
让人感觉非常Unix-y,这很痛苦。使用
memcpy
。我不知道为什么会被否决,所以我不得不猜测如何改进这个问题:(如果文件*只是读取或写入的,没有搜索,您可能可以为此使用命名管道。相关:@anatolyg这是相关的,但那里的答案要么说无法完成(接受的答案)或者提供依赖unix行为或GNU c-library的解决方案。你有这一说法的来源吗?@anatolyg:可能可以创建一个
文件*
对象来满足OPs的需要,但因为它实际上不是一个文件,所以我支持我的答案。但还应该注意的是,对于你链接的问题,大多数答案都是正确的不适用于Windows,唯一适用于Windows的是仅输出(例如,我喜欢Ross关于使用命名管道的建议)。@skyking:文档作为一般规则,描述了什么是可能的,而不是什么不可能的,因此不,我没有一个规范的源代码。:-),但我会非常惊讶地发现其他情况。(并不是说有任何东西阻止第三方文件系统实现它们。但我假设您希望在普通Windows系统(即NTFS)上实现这些功能。)…也有各种奇怪的方法,例如RAM磁盘或卷影。但在我看来,它们比临时文件更具侵入性,而不是更少。