2011-11-14 45 views
0

我想在窗口中添加某种“挂钩”(只能在Windows Server 2008 R2及更高版本上运行),当我请求磁盘上的文件时,它不在那里,然后从Web服务器和缓存中请求它它在当地。Windows - 在文件系统中的FileNotFound时,按需下载文件?

这些文件是不可变的,并且具有唯一的文件名。

试图打开这些文件的应用程序是用C语言编写的,只是以正常方式使用操作系统打开文件。假设它叫OpenFile要求c:\scripts\1234.12.script,那就是在那里它会正常打开它。如果那么它要求c:\scripts\1234.13.script,那么它就不是那么我在操作系统中的钩子就会去问问我的Web服务的文件,下载它,然后返回该文件,因为它一直在那里。

我宁愿把它写成一个用户模式的过程(我从来没有写过一个Windows驱动程序),它应该只在特定文件夹中没有找到文件时才会触发,而且我宁愿如果可能的话写它以托管语言(C#将是完美的)。这些文件很小(< 50kB),网络服务速度快,互联网连接失明,所以我不希望它需要一秒多的时间来下载文件。

我的问题是 - 我从哪里开始寻找关于这种事情的信息?如果有人做了类似的事情 - 你知道我有什么选择吗(例如可以在C#中完成吗?)?

回答

1

您需要创建一个内核模式文件系统过滤器驱动程序,该驱动程序可以拦截打开此类文件的请求并“伪造”这些文件。我应该说,即使是驾驶员的发展,这也是一项非常复杂的任务。我们的CallbackFilter产品能够解决您的问题,但“伪造”文件的机制尚未准备就绪(我们为CallbackFilter 3规划此功能)。在那之前,我不知道任何可以解决您的问题的用户模式解决方案(坦率地说,没有内核模式解决方案)。

如果您可以更改应用程序正在访问的文件夹,则可以创建虚拟文件系统并将其映射到NTFS驱动器上的驱动器盘符或文件夹。从虚拟文件系统中,您可以将大部分请求引导至真实磁盘或从真实磁盘引导,并且如果该文件不存在,则可以下载该文件并对其进行缓存。我们的其他产品Callback File System可让您按照用户模式进行操作。如果您需要完成一项一次性任务,并且没有预算,请与我们联系,也许我们可以找到一些解决方案。还有一个开放源代码解决方案具有类似(但不是很全面)的功能,叫做Dokan,但我不会评论它的质量。

+0

我怀疑它可能相当复杂,谢谢你的回答和指导。你的产品看起来很有趣,目前我已经通过改变应用程序的代码寻找文件本身来解决它(例如,它首先检查,如果它不在磁盘上,则获取文件)。 –