5

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

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

我怎样才能仍然向该方法发送一个字符串(路径),从而在FileStream不实际接触硬盘驱动器的情况下创建一个新的?

例如“\MEMORY\myfile.bin”?

4

4 回答 4

1

嗯——就是这么想的。
基本上,您有三种可能的解决方案:

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

显然,最推荐的是使用反射器来修改给定的库。否则,我无法为您找到解决方案。

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

于 2012-07-13T17:30:52.780 回答
1

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

于 2012-07-13T17:51:47.730 回答
1

这一切都取决于图书馆的构建方式。

如果它是一个使用 100% 托管的库FileStream,那么您可能会被卡住。

如果它采用提供的文件名并调用本机 WIN32CreateFile函数,则可以给它提供其他文件而不是文件,例如命名管道。

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

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

于 2012-07-13T17:55:30.590 回答
0

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

于 2012-07-13T17:25:43.937 回答