c++ - 让 Windows 尝试读取文件

标签 c++ windows winapi

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

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

问题是,是否有可能让 Windows 继续尝试读取文件,而不阻止整个驱动器操作,既不阻止打开文件的软件,又让用户有机会取消打开过程。

起初,我尝试在数据可用之前阻止驱动程序,此解决方案实现起来更直接,但用户体验并不是最好的。而且,依赖网络传输不是一个好主意,传输可能会持续很多时间,而驱动程序将一直处于阻塞状态。

我实现的第二种方法是,当文件被缓存时以及文件不可用时仅返回数据,告诉 Windows 该文件的大小长度为 0,并在后台进程中下载文件。这样,驱动程序就不会阻塞窗口,用户体验得到改善,但用户需要打开N次文件,直到有数据可用。

我认为最好的解决方案是向 windows 返回一条消息,如“没有可用数据,5 秒后重试”,我认为如果驱动程序向 windows 返回适当的错误代码,这是可以实现的,但是错误列表太长,名称并不总是像您想要的那样具有描述性。

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

最佳答案

您实现的行为对于驱动程序是正确的。处理慢速 I/O 的责任在更高层次。例如,Windows Explorer 非常小心,不试图从任何文件中检索甚至一个字节,完全依赖于元数据。

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

关于c++ - 让 Windows 尝试读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587521/

相关文章:

c++ - 用于 WinRT 的 zlib?

c++ - Visual Studio : Command line error D8016: '/Ox' and '/RTC' command-line options are incompatible

c++ - 编写一个带有我自己的异常的包装器

python - "Error 1053: The service did not respond timely",无法从 Python 代码启动使用 cx_Freeze 创建的 Windows 服务

c++ - 无法更改 WinAPI 中的编辑控制文本

c++ - 如何在模板上定义操作而不关心它实例化的类型?

windows - 如何将所有快捷方式重定向到给定的可执行文件? Windows 上是否有任何等同于符号链接(symbolic link)的东西?

c# - 无法递归删除用户文件夹中的文件夹。 'System.UnauthorizedAccessException' 出现在 mscorlib.dll 中

c++ - CRITICAL_SECTION 并避免包含 windows.h?

c++ - 将 x86 代码注入(inject) x64 进程