让Windows试图读取文件

时间:2009-10-19 08:27:39

标签: c++ windows winapi

我正在对Windows文件系统进行一种封装。

当用户请求打开文件时,windows会调用我的驱动程序来提供数据。在正常操作中,驱动程序返回缓存的文件内容,但是,在某些情况下,实际文件不会被缓存,我需要从网络下载它。

问题是,是否可以让Windows试图在不阻止整个驱动器操作的情况下读取文件,而不是打开文件的软件,让用户有机会取消打开过程。

起初,我试图阻止驱动程序,直到数据可用,这个解决方案更直接实现,但用户体验并不是最好的。此外,依靠网络传输不是一个好主意,转移可能会持续很长时间,驱动程序将一直阻塞。

我实现的第二种方式,包括仅在文件缓存时返回数据,当文件不可用时告诉窗口文件的大小为0,并在后台进程中下载文件。有了这个,驱动程序不会阻止窗口,并且用户体验得到改善,但是用户需要打开文件N次,直到数据可用。

我认为最好的解决方案是向窗口返回一条消息,例如“没有数据可用,请在5秒内再试一次”,我认为如果驱动程序将可能的错误代码返回到Windows,则可以实现,但错误列表太长,名称并不总是您想要的描述。

你有什么建议实现吗? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

您实施的行为对于驱动程序是正确的。处理缓慢I / O的责任在于更高层次。例如,Windows资源管理器在尝试从任何文件中检索甚至单个字节时都非常小心,完全依赖于元数据。

但是,在忙碌时不要返回失败代码。正是这种失败会迫使用户重复打开文件。

答案 1 :(得分:0)

你可以产生一次又一次尝试的线程,在成功或超时时报告结果。

答案 2 :(得分:0)

向我显示一条消息“无数据可用,请在5秒后重试”听起来非常糟糕,但这取决于您的场景(您可能会详细说明您的目标是什么)。

关于从网络获取数据,这听起来像是线程发挥作用的一个主要例子。您是否考虑过在工作线程中复制文件?这样你就不必阻止任何东西,并且用户不会觉得系统挂起