windows - 我可以在 Windows 中创建仅存在于内存中的文件吗?如果可以,如何创建?

标签 windows winapi temporary-files memory-mapped-files

这个问题不是任何这些现有问题的重复:

  • How can I store an object File that only exists in memory as a file inside of my storage system? - 这个问题与 Java 的 File 无关API。
  • Temp file that exists only in RAM? - 这与我的要求很接近,除了 OP 没有询问如何从内存中创建文件以便共享将它们传递给子进程
  • 我也不是在询问 Win32 的内存映射文件——因为它们本质上与我所追求的相反:内存映射文件是磁盘上的文件,它映射到进程的虚拟内存空间——而什么我想要的是一个存在于操作系统文件系统(但不是磁盘的物理文件系统)中的文件,例如挂载点,并且该文件的数据映射到内存中的现有缓冲区。
  • 即,对于内存映射文件,写入/写入特定缓冲区地址和内存偏移量的字节将导致修改与文件开头相同偏移量的字节 - 但文件物理存在于磁盘上,这不是我想要的。

  • 详细说明并提供上下文:
  • 我有一个 ASP.NET Core 服务器端应用程序,它定期接收大小在 1 到 10MB 之间的请求流。该程序将仅在 Windows/Windows Server 上运行,因此可以使用 Windows 特定的功能。
  • 75% 的时间我的应用程序只是自己读取这些流,仅此而已。
  • 但在少数情况下,它需要一个单独的应用程序读取它开始使用的数据 Process.Start并将文件名作为命令行参数传递。
  • 它通过将流保存到磁盘上的临时文件并传递该流的文件名,将数据传递给这些单独的应用程序。
  • 不幸的是,它无法将内容写入子进程的stdin。因为其中一些程序需要磁盘上的文件,而不是从 stdin 读取文件。 .
  • 此外,虽然运行它的机器有大量 RAM(因此将流缓冲在内存中很好),但它的 HDD 旋转速度较慢,这是避免磁盘上临时文件的进一步原因。
  • 我想避免不必要的缓冲和复制 - 理想情况下,我想将整个 1-10MB 请求流式传输到单个内存缓冲区中,然后将相同的缓冲区公开给其他进程并使用相同的缓冲区作为支持一个临时文件。
  • 如果我在 Linux 上,我可以使用 tmpfs - 它并不完美:
  • 据我所知,现有进程无法指示操作系统获取其虚拟内存的现有区域并将文件映射到 tmpfs。到那个内存区域,而不是 tmpfs仍然需要通过将所有数据写入(即复制)其文件描述符来填充文件 - 这与拥有零拷贝系统的目标背道而驰。
  • Windows 的内置 RAM 磁盘功能仅限于通过第三方设备驱动程序为 RAM 磁盘实现提供基础 - 我很惊讶微软从未在 Windows 中提供内置 RAM 磁盘 GUI 或 API ,尤其是考虑到它们的相对简单性。
  • The ImDisk program是使用 Microsoft 的 RAM 磁盘驱动程序平台实现的 RAM 磁盘,但据我所知,它更像 tmpfs因为它可以创建仅存在于内存中的文件,所以它不允许文件的数据由正在运行的进程(或共享内存缓冲区)可直接访问的缓冲区支持。
  • 最佳答案

    CreateFileMapping hFile = INVALID_HANDLE_VALUE “创建由系统分页文件而不是文件系统中的文件支持的指定大小的文件映射对象”。
    来自 Raymond Chen 的 The source of much confusion: “backed by the system paging file” :

    In other words, “backed by the system paging file” just means “handled like regular virtual memory.”

    If the memory is freed before it ever gets paged out, then it will never get written to the system paging file.

    关于windows - 我可以在 Windows 中创建仅存在于内存中的文件吗?如果可以,如何创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61691334/

    相关文章:

    c - Windows目录是存放临时文件的地方 - GetTempPath函数

    c++ - 部署使用 C++ 开发的应用程序

    python - 简单的 python Web 服务器在 Windows 10 上被阻止

    c++ - MFC框架中如何使用XML over HTTP实现双向通信

    android - Genymotion 无法在 Windows 10 上加载 VirtualBox 引擎

    python - Heroku Django 应用程序错误 : 'module' has no attribute 'TemporaryDirectory'

    c - WinAPI 获取鼠标光标图标

    C# PInvoke 通过 Win32 API 获取文件和文件夹的 ACL

    c++ - 将文本日期和时间转换为 ATL::CTime

    r - 在 R 中使用 tempfile() 创建的临时文件会发生什么?