码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • windows中关闭占用文件的程序


    文章目录

      • 前言
      • 需求分析
      • 概要设计中的难点-如何通过文件查找到占用文件的进程
        • Windows句柄是什么
        • 枚举(文件)句柄
      • 小结

    前言

    在windows中编程。有些文件重新生成,但是被正在运行的程序占用,导致重新生成失败。所以,我希望写个小工具,它实现这样的功能。

    • 扫描当前路径下的文件,查看哪些文件被占用。
    • 杀死占用文件的程序。

    PS: 最后的工具FreeFile,需要在配置文件中指定被占用的文件。运行FreeFile,杀死占用文件的程序。


    需求分析

    • 首先,我们需要搞明白造成文件被占用而无法删除的大概原因(具体原因我不知道,是文件系统层面的东西):为什么 Windows 文件设计成占用无法删除?、不能删除 NTFS 文件系统卷上的文件或文件夹

    • 接着,我们查找手动关闭占用文件进程的方法:Windows 11删除正在被程序占用的文件夹、How do you find what process is holding a file open in Windows?

    • 剩下的工作是,使用代码自动执行上一步的过程。


    概要设计中的难点-如何通过文件查找到占用文件的进程

    我对win系统编程基本一窍不通。但既然有这个想法,那撸起袖子干吧。

    Windows句柄是什么

    参考:深入了解Windows句柄到底是什么、What is a Windows Handle?

    正确地说,在 Windows 中,句柄是一种抽象,它向 API 用户隐藏真实内存地址,允许系统对程序透明地重新组织物理内存。将句柄解析为指针会锁定内存,释放句柄会使指针无效。在这种情况下,可以将其视为指针表的索引……您将索引用于系统 API 调用,系统可以随意更改表中的指针。

    枚举(文件)句柄

    参考:

    1. Handle v4.22 - windows工具无源码
    2. yihleego/handle-tools
    3. 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
    4. Use Windows Native API to enumerate all handles and find the corresponding file name of the file handle

    上面参考给出了两种思路。

    第一种是yihleego/handle-tools。

    • 使用NtQuerySystemInformation function获取到所有句柄。(但是会用到win开发文档没有的参数。当然这个参数确实有效。似乎是没有作为接口参数暴露出来。)
    • 使用OpenProcess function,根据枚举句柄对应的进程标识符,返回进程的句柄。(如果指定的进程是系统进程或客户端服务器运行时子系统 (CSRSS) 进程之一,此函数将失败)
    • 使用NtDuplicateObject,在当前进程,创建枚举句柄的副本。(上面一步和下面这步,应该是为了跨进程共享对象)
    • 使用NtQueryObject,检索句柄的对象信息。
    • 使用NtQueryObject function,获取句柄的名称和类型信息。

    总体是:获取所有句柄;枚举句柄,将当前枚举到的句柄复制到当前进程;打印枚举的句柄信息;(逻辑上应该没有什么问题)

    第二种是Handle v4.22 - windows工具无源码。这是win文档中的一个小工具,可以个人使用,但是没有源码。看它的输出,大概的思路应该是:

    • 遍历所有进程。可参考:枚举所有进程
    • 遍历进程中的所有句柄。

    总体是:和上面的区别不大。


    小结

    完整代码见:da1234cao/FreeFile
    我对win编程不感冒,这个项目也非常简单,不涉及网络,多线程,数据库,图形界面等难点。
    但它给我带来了编程中的两个组件:配置文件和日志,详见:

    • 配置文件的读取-TOML
    • spdlog日志库的封装使用
  • 相关阅读:
    Qt出现假死冻结现象
    Bitmap加载内存分析
    组件的使用
    flink实战--如何基于java-agent技术增强Flink功能
    【GAMES101】作业 7: 路径追踪
    python基础05 循环 变量 函数组合案例
    Simulink|电动汽车、永磁电动机建模与仿真
    【python学习】基础篇-常用模块-argparse模块:用于解析命令行参数和选项
    YoloV8改进策略:Inner-IoU+clou,YoloV8的涨点明珠
    【详识JAVA语言】面向对象程序三大特性之一:封装
  • 原文地址:https://blog.csdn.net/sinat_38816924/article/details/126192976
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号