C#非托管文件句柄操作 C#如何使用SafeFileHandle-C#.Net教程

SafeFileHandle 是 .NET 封装 Windows 文件句柄的安全类型,实现 IDisposable 并参与 GC 管理;直接用 IntPtr 易致资源泄漏、双重关闭及崩溃。

SafeFileHandle 是什么,为什么不能直接用 IntPtr

SafeFileHandle 是 .NET 提供的用于封装 Windows 文件句柄(HANDLE)的安全包装器,它实现了 IDisposable 并参与 .NET 的垃圾回收生命周期管理。直接用 IntPtr 存储句柄会导致资源泄漏或双重关闭——因为 GC 不知道该何时释放、也无法保证只释放一次。

常见错误现象:ObjectDisposedException、IOException(“句柄无效”)、程序在高并发文件操作时偶发崩溃。

  • 必须继承 SafeHandle 并重写 ReleaseHandle(),而 SafeFileHandle 已为你做好了:它调用 CloseHandle() 且能正确处理 INVALID_HANDLE_VALUE
  • 构造时必须传入有效的非托管句柄,并设 ownsHandle = true(表示托管层负责释放),否则 GC 不会触发清理
  • 一旦调用 Dispose() 或被 GC 回收,内部 handle 会被置为 IntPtr.Zero,再次访问会抛 ObjectDisposedException

如何从 CreateFile 获取 SafeFileHandle

Windows API 的 CreateFile 返回 IntPtr,你需要把它转成 SafeFileHandle 实例——但不能直接 new,必须用它的受保护构造函数,所以得自己封装一层子类,或使用 .NET 5+ 提供的 SafeFileHandle(IntPtr, Boolean) 公共构造函数。

示例(.NET 6+):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C#非托管文件句柄操作 C#如何使用SafeFileHandle-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998017+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998017+
  • 本周更新: 0+
  • 最后更新: 2026-03-16