如何在Windows中异步打开文件

2023-11-24

有没有办法在 Windows 中异步打开文件? CreateFile API 函数只有 FILE_FLAG_OVERLAPPED,允许进一步异步读取和写入。尽管如此,文件的打开似乎是同步的。鉴于它必须访问文件系统(并可能执行昂贵的 IO 操作),它可能是一个潜在的阻止者。

这实际上是一个根本问题,是否可以在 .NET 中异步打开文件(因为无法等待 FileStream ctor)。但如果操作系统中无法做到这一点,那么这个问题就毫无意义。


不幸的是,在用户模式下无法异步创建/打开文件。即使司机回来了STATUS_PENDING for IRP_MJ_CREATE,在这种情况下系统将等待,直到驱动程序完成IRP在它从创建/打开文件函数之一返回控制之前。

只有当我们处于内核模式时才有可能,如果您自己格式化IRP_MJ_CREATE并将其发送给司机。但即使在这种情况下,驱动程序几乎总是会处理IRP_MJ_CREATE同步地。


对于 API 来说是异步的 - 操作完成时必须以某种方式通知调用者

windows 为此使用了 3 种方法

  1. 参数中的一些回调例程,通常是 APC (PIO_APC_ROUTINE) 操作完成时调用
  2. 参数中的一些Event,当操作完成时,Event设置在 信号状态。
  3. 文件句柄,用于api调用,与某些IOCP绑定。什么时候 操作完成的数据包将排队到 IOCP。 (我们稍后通过调用删除这个数据包GetQueuedCompletionStatus (ZwRemoveIoCompletion) or KeRemoveQueue

3)在我们的例子中是不可能的,因为文件句柄尚未创建,所以它不能绑定到任何IOCP。关于 1) 和 2) 让我们查找文件打开/创建 api 签名:

在用户模式下,打开/创建文件的最低级别 api 是ZwOpenFile and ZwCreateFile. CreateFile外壳已过ZwCreateFile。在内核模式下NtOpenFile -> NtCreateFile -> IoCreateFile -> IoCreateFileEx even - IoCreateFileEx(创建文件的最低级别 api) - 没有事件或 [Apc] 回调参数 - 所以不是异步的。IoCreateFileEx call ObOpenObjectByName(未记录,但导出例程) - 这里也没有 1) 或 2) 参数 - 这又是通过设计 api 同步的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Windows中异步打开文件 的相关文章

  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 如何批量获取子字符串在字符串中的位置

    获取子串的位置 Set str1 This is Test string Set sstr Test 这里我需要获取 Test 8 的位置 谢谢 echo OFF SETLOCAL Set str1 This is Test string
  • 为什么 dotnet 的 char.IsLower() 是静态方法?

    这似乎违背了每一个设计准则 接受 T 类型的单个参数的静态方法通常应该只是一个成员方法 这太奇怪了我实际上不得不发布一个StackOverflow问题 https stackoverflow com questions 389100 is
  • Foursquare - OAuth 身份验证 - .Net 示例

    是否有关于如何使用 Oauth 向 Foursquare 进行身份验证的示例 这里有一个关于如何将 OAuth 与 Foursquare 结合使用的非常好的工作流程摘要 http developer foursquare com docs
  • 更改当前工作目录 VS13?

    如本文所述post https stackoverflow com questions 11979632 c sdl why does sdl loadbmp return null我调试 SDL 程序时的工作目录是相对于 vcproj 而
  • Powershell - 在不安装 Excel 的情况下将 CSV 转换为 XLS

    我有一台自动生成报告的服务器 报告采用 CSV 格式 我需要能够直接加密文件 无需第三方压缩 无 WinZIP 或 WinRAR 我认为最好的想法是将 CSV 转换为 XLS 然后通过 Powershell 密码保护 XLS 文件 不幸的是
  • .NET 标准与 .NET 核心

    我已经了解了 NET Standard 和 NET Core 之间的区别 但我真的不知道区别是什么 或者何时选择 NET Standard 库项目以及何时选择 NET Core 库项目 我读到 NET Standard 是为了确保一组 AP
  • 使用 XML 的 WCF 请求验证

    我有一个WCF使用 Net 4 0框架的SOAP Web服务 我在用contract first方法 即 服务代码是使用 WCSF Blue 工具从手写 WSDL 生成的 我对请求消息有以下要求 如果价格小于 100 则不得有税项 但如果大
  • OleLoadPicturePath 是否已以非向后兼容的方式更改?

    我最近遇到一个问题 我能够在一台 PC 上将图标添加到 VB6 表单 它运行良好 但他们无法在第二台 PC 上运行 编译它 结果发现图标文件是 32 位的 包括 Alpha 通道 这就是问题所在 但令我惊讶的是 这是一个依赖于系统的功能 在
  • 批处理脚本 - IF EXIST 复制到 %localappdata% 错误

    我似乎被批处理脚本困住了 需要一些帮助 基本上我需要检查文件是否存在于文件夹中 localappdata 如果确实如此 则覆盖该文件 如果没有放置在不同的位置 那么目前它的内容如下 IF EXIST localappdata foldern
  • 如何在VS2017中从.net项目引用netstandard项目?

    我有一个 netstandard2 0 项目 用于与第三方 Web 服务交互 我需要在同一解决方案中引用旧的 net 4 6 2 项目中的该项目 但是当我这样做时 我会收到一堆关于需要引用我定义的类型的错误 例如 我将调用 netstand
  • 如何证明 .NET CLR JIT 每次运行只编译每个方法一次?

    There s 一个老问题 https stackoverflow com questions 1255803 does the net clr jit compile every method every time 1255832每次询问
  • Windows Aero - 以编程方式禁用视觉效果

    有谁知道是否有一个 API 可以通过编程方式禁用 启用特定的 Windows 视觉效果 例如 启用透明玻璃 或 启用 Aero Peek 我指的效果是在以下位置配置的效果 系统 高级系统首选项 高级 选项卡 性能设置 自定义 我正在为 Wi
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

    我正在编写一个 Windows 32 位程序 可以使用多个可能的 dll 之一 所以它尝试依次加载每个 dll 使用SysUtils SafeLoadLibrary如果加载成功 它就会使用该 dll 不幸的是 其中一些 dll 静态链接到其
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 如何为 Windows toast 注册协议?

    如何注册 Windows toast 协议 样本中来自https blogs msdn microsoft com tiles and toasts 2015 07 02 adaptive and interactive toast not

随机推荐

  • iOS 6 中不显示“[App]”想要访问 Twitter 帐户的警报

    我正在使用 TWTweetComposeViewController 访问用户的 Twitter 帐户 他 她已在 设置 gt Twitter 中添加了该帐户 当应用程序尝试访问 Twitter 帐户时 它应该显示一条警报 其中包含类似于以
  • 按值和引用传递数组

    这些是我正在阅读的一本 C 书中的示例 只是在理解这个示例实际上在做什么时遇到了一些困难 希望有一个解释来帮助我进一步理解这里发生的事情 creates and initialzes firstArray int firstArray 1
  • 使用Python代码清除控制台时如何修复“TERM环境变量未设置”?

    我使用 Pycharm 当我运行这个 Python 代码时 os system clear 我收到此错误 未设置 TERM 环境变量 在 Python 控制台的变量中 我输入 export TERM xterm 我还可以做些什么 尝试这个配
  • gnuplot:填充面积曲线,使抽动保持在顶部

    在 gnuplot 中 当您尝试填充曲线下的区域时 两个轴的抽动都会隐藏在实体区域后面 有什么办法可以让他们到前面去吗 我正在使用 postcript 终端 其中不允许透明功能 我猜 谢谢 肯定有 在绘图之前 以交互方式或在脚本中运行此命令
  • 无法连接(空)::selectionChanged 为 QTableView

    我有以下升级的 QTableView class QRightClickableTableView public QTableView Q OBJECT public explicit QRightClickableTableView QW
  • 如何在不禁用上下文菜单的情况下拦截 UITextView 上的长按?

    我想拦截 UITextview 上的长按 但不想同时禁用上下文菜单选项 如果我在文本视图上使用手势识别器 它将禁用上下文菜单 所以我现在使用如下方法 BOOL canPerformAction SEL action withSender i
  • Spring webflux 错误处理程序:如何在错误处理程序中获取请求的反应器上下文?

    Spring boot 2 1 5 项目 Reactor 3 2 9 在我的 webflux 项目中 我广泛使用反应器上下文来传递一些值 我的目的是能够获取异常处理程序内部的上下文 一个简单的例子 Component Order 2 pub
  • 如何在 SwiftUI 中设置清晰/透明背景的导航栏?

    我试图弄清楚如何为自定义导航栏编写代码以显示清晰 透明的栏而不是 白色 栏 看这个截图 这是我的代码 import SwiftUI struct ContentView View init UINavigationBar appearanc
  • Zend Framework 2:如何在应用程序到达控制器之前将重定向放入模块中

    假设我们有一个名为 Cart 的模块 并且希望在满足某些条件时重定向用户 我想在应用程序到达任何控制器之前在模块引导阶段放置重定向 所以这是模块代码 我想使用Url控制器插件 但似乎现阶段控制器实例不可用 至少我不知道如何获取它 提前致谢
  • 如何在IdentityServer4中进行多步登录?

    我们使用 IdentityServer3 隐式授权并且登录由多个屏幕组成 在 IdentityServer3 中 内置了对此类多步骤登录工作流程的支持 例如接受 EULA 双因素登录等 该功能称为 部分登录 甚至还有一个例子 https g
  • 在 Eclipse 中使用 Ant 的类路径

    我有一只蚂蚁build xml文件在命令行上运行得很好 它编译 构建 JAR 并且我能够从 JAR 中很好地执行 main 方法 这build xml文件引用了分散在各处的几个第三方库 构建 JAR 时 脚本不会将所有第三方库包含到 JAR
  • 这是从数组哈希中获取公共元素的最佳方法吗?

    我正在尝试从 Ruby 中的一组数组中获取一个公共元素 通常 您可以使用 运算符来比较两个数组 返回两个数组中存在或共有的元素 这一切都很好 除非您试图从多个对象中获取共同元素two数组 但是 我想从未知的动态数组数量 它们存储在哈希中 我
  • 如何处理原始可空类型的 Spark UDF 输入/输出

    问题 1 如果输入是包含以下内容的原始类型列 Spark 不会调用 UDFnull inputDF show x null 1 0 inputDF withColumn y udf x Double gt 2 0 apply x will
  • 禁用 jQuery 中的按钮

    我的页面创建多个按钮id rbutton i 下面是我的代码
  • Eclipse 错误:无法确定 /project-path/ 的 URI

    我在 VirtualBox 中的 Ubuntu 12 0 4 上使用 Windows 8 主机运行 Eclipse Luna 每隔一段时间 我就会启动 Ubuntu 并打开 Eclipse 来查找以下内容 我的项目应该列在包资源管理器中 但
  • python的“in”语言构造对于列表来说是线程安全的吗?

    Is obj in a list线程安全的同时a list可能会在不同的线程中修改 这是一个全面但非详尽的示例列表 of list操作以及它们是否是线程安全的 但是我找不到任何参考in语言构造 在 python 实现方面 我使用 CPyth
  • 简单的 html dom 抓取大型 html 文件

    我需要抓取一个大的 html 文件 例如 http www indianrail gov in mail express trn list html 使用简单的 html dom 我从一个简单的脚本开始 它什么也没显示 只是一个空白页 其中
  • 查找 TabStrip 索引

    是否可以在 KendoUI TabStrip 中找到选项卡的索引 我需要找到我选择的选项卡的索引 编号 并且我知道select 返回我当前的选项卡 但我不知道如何将其转换为数字 找到了解决方案 tabstrip data kendoTabS
  • VAO 是否会记住 EBO/IBO(元素或索引)和 VBO?

    我的代码正在正常工作 但这可能是一个巧合 我不想稍后再纠缠于错误 所以我试图尽可能保持它干净 我执行以下操作来初始化网格 生成并绑定 VBO 和缓冲区数据 生成并绑定 IBO 和缓冲区数据 生成并结合 VAO 绑定与之前相同的 VBO 在
  • 如何在Windows中异步打开文件

    有没有办法在 Windows 中异步打开文件 CreateFile API 函数只有 FILE FLAG OVERLAPPED 允许进一步异步读取和写入 尽管如此 文件的打开似乎是同步的 鉴于它必须访问文件系统 并可能执行昂贵的 IO 操作