如何创建虚拟文件?

Emm*_*dec 14 c++ windows winapi named-pipes

我想在不将其写入磁盘的情况下模拟文件.我的可执行文件末尾有一个文件,我想给它一个dll的路径.当然,因为它没有真正的路径,我必须伪造它.

我首先尝试在Windows下使用命名管道来完成它.这将允许像\\.\ pipe\mymemoryfile这样的路径,但我不能使它工作,我不确定DLL会支持这样的路径.

其次,我找到了CreateFileMapping和GetMappedFileName.它们可以用来模拟另一个片段中的文件吗?我不确定这是这个API的作用.

我正在尝试做的似乎与boxedapp类似.有关他们如何做的任何想法?我想这就像API拦截(像Detour),但这将是很多工作.还有另一种方法吗?

为什么?我对这个特定的解决方案很感兴趣,因为我想隐藏数据并且只是为了分发一个文件而且为了让它以这种方式工作的极端原因;)我同意将数据复制到临时文件会起作用并且是一个更容易的解决方案.

Mas*_*ons 6

使用BoxedApp,不用担心.

  • 酷应用!它甚至可以与虚拟注册表一起使用! (2认同)

Ste*_*iss 5

管道用于并发运行的进程之间的通信.它们不存储数据以供以后访问,并且它们与文件没有相同的语义(例如,您无法搜索或回滚管道).

如果您处于类似文件的行为,最好的办法就是使用文件.在Windows下,您可以传递FILE_ATTRIBUTE_TEMPORARYCreateFile系统提示,以避免在有足够内存的情况下将数据刷新到磁盘.

如果您担心写入磁盘的性能损失,上述内容应足以避免在大多数情况下对性能产生影响.(如果系统内存足够低以强制将文件数据输出到磁盘,那么它可能也会大量交换 - 你已经遇到了性能问题.)

如果你因为其他原因试图避免写入磁盘,你能解释一下原因吗?一般来说,很难阻止数据进入磁盘 - 例如,用户可以随时休眠机器.


vil*_*pam 5

您可以将数据存储在NTFS流中.这样你就可以得到一条指向你的数据的真实路径,你可以以你的形式提供给你的dll

x:\myfile.exe:mystreamname
Run Code Online (Sandbox Code Playgroud)

这与普通文件非常相似,但只有在使用的文件系统是NTFS时才有效.这在Windows现在是标准配置,但如果您想支持旧系统或希望能够从usb-stick或类似设备运行它,当然不是一个选项.请注意,如果文件作为邮件中的附件发送,或者只是从NTFS分区复制到FAT32分区,则文件中存在的任何流都将丢失.

我要说最兼容的方法是将数据写入实际文件,但是你当然可以在NTFS系统上以一种方式在FAT系统上进行另一种方式.我建议反对它,因为增加了复杂性.当然,适当的方法是单独分发文件,但由于您已经表明不需要这样,所以在这种情况下,您应该将其写入临时文件并为dll指定该文件的路径.确保将临时文件写入用户的临时目录(可以在C/C++中使用GetTempPath找到路径).

你的另一个选择是写一个文件系统过滤器驱动程序,但这是我强烈建议的道路.这种方式也破坏了使用单个文件的目的......

此外,如果您只想要一个文件进行分发,那么如何使用zip文件或安装程序?