将内存流表示为物理文件



我今天遇到了一个愚蠢的问题:

在我的项目中,我必须使用一个库(我无法替换),问题是我使用MemoryStream,而不是经常保存到HDD(因为有很多文件,而且它们的大小很小,所以它非常适合MemoryStream)。问题是库API是围绕文件系统访问构建的,其中一个函数只接受文件的直接路径。

我怎么还能向该方法发送一个字符串(路径),从而在不实际接触硬盘的情况下生成一个新的FileStream

例如"\MEMORY\myfile.bin"?

好吧,这是我的想法
基本上,您有三种可能的解决方案:

  1. 您可以使用反射器来修改给定的库
  2. 您可以检查适当的方法,然后,通过使用一些反射魔法,可能能够在运行时修改对象(非常不推荐)
  3. 您可以使用系统调用和API,并通过进入低级ring0程序集修改kernal.dll来将I/O查询从您的路径引用到内存。(也许在没有ring0访问的情况下这是可能的——我不确定)

显然,最推荐的是使用反射器来修改给定的库。否则,我看不出适合你的解决方案

在回复第一条评论时,您可以:
使用RAMDrive(一个分配小块系统内存并将其显示为分区的程序)

如果文件必须存在于磁盘上(并且只接受磁盘路径),那么主要选项是虚拟文件系统,它允许您将自定义数据公开为文件系统。有几个选项,例如现在已经失效的Dokan、我们的Solid File System OS Edition和回调文件系统(请参阅我们的虚拟存储产品线的描述),也许Pismo File Mount可以工作(从未仔细研究过)。

这一切都取决于库的构造方式。

如果它是一个使用FileStream的100%托管库,那么您可能会陷入困境。

如果它使用提供的文件名并调用本机WIN32 CreateFile函数,则可以为它提供除文件之外的其他内容,例如命名管道。

要快速测试是否可能,请将@"\.piperandom_name"传递给该方法:如果它的响应明确表示无法打开以\.开头的管道和文件名,那么,对不起。另一方面,如果它说找不到文件,你就有机会让它工作。

然后,您可以创建一个NamedPipeServerStream,并为以\.pipe为前缀的库方法调用使用相同的名称。

您不能将其"表示"为文件,但可以使用StreamWriter类将其"转换"为文件。

最新更新