将Memory Stream表示为物理文件

时间:2012-07-13 17:23:15

标签: c# api filesystems memorystream

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

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

如何仍然向该方法发送一个字符串(路径),这会产生一个新的FileStream而不会实际触摸硬盘?

例如“\ MEMORY \ myfile.bin”?

4 个答案:

答案 0 :(得分:1)

嗯 - 那是想的。
基本上,您有三种可能的解决方案:

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

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

答案 1 :(得分:1)

如果文件必须存在于磁盘上(并且只接受磁盘路径),则main选项是一个虚拟文件系统,它允许您将自定义数据公开为文件系统。有几个选项,例如现在死亡的Dokan,我们的Solid File System OS版和回调文件系统(参见我们的Virtual Storage产品系列的描述),也许Pismo File Mount可以工作(从未仔细研究过它)。

答案 2 :(得分:1)

这完全取决于库的构建方式。

如果它是使用FileStream的100%托管库,则可能会卡住。

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

要快速测试是否可行,请将@"\\.\pipe\random_name"传递给方法:如果它通过明确说明无法打开管道和文件名以\\.\开头来回答,那么,抱歉。另一方面,如果它说它找不到文件,你就有机会使它工作。

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

答案 3 :(得分:0)

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