news 2026/5/9 10:11:17

Qt 工程瘦身工具:批量删除 build 目录与 IDE 配置文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt 工程瘦身工具:批量删除 build 目录与 IDE 配置文件

目录

    • 一、创作动机
    • 二、脚本的作用
    • 三、脚本做了什么(详细说明)
      • 3.1 环境准备
      • 3.2 扫描与统计
      • 3.3 清理当前目录
      • 3.4 遍历子目录清理
      • 3.5 统计报告
    • 四、脚本代码
    • 五、逻辑流程
    • 六、使用方法
    • 七、下载

一、创作动机

作为一名 Qt/QML 开发者,你一定遇到过这样的情况:

辛辛苦苦写了数十个示例工程,目录结构整整齐齐,某天想把这些工程打包发出去或者备份到网盘时,却发现压缩包大得离谱。仔细一看,原来每个工程目录下都残留着build文件夹、CMakeLists.txt.user文件等编译产物。一个小工程可能只有几百 KB 的源码,但编译后动辄几十 MB,几十个工程加起来就是好几个 GB。

如果一开始就做好了统一的编译输出管理(比如设置CMAKE_BINARY_DIR指向外部目录),自然不会遇到这个问题。但现实往往是:项目太多了,前期没有规范,后期已经来不及逐个修改了

这时候,你有几个选择:

  1. 手动删除—— 几十个目录挨个进去删,枯燥且容易遗漏。
  2. 交给 AI 写脚本—— AI 生成的代码不一定可靠,万一误删了源码就麻烦了。
  3. 自己写一个固定的脚本—— 一劳永逸。脚本逻辑确定、行为可控,以后每次打包前双击运行即可。

这个脚本正是为第三种场景而生的。


二、脚本的作用

一句话概括:递归清除当前目录下所有 Qt/QML 工程的编译产物,不动源码一根汗毛。

具体清理的目标文件/文件夹:

目标类型说明
build/目录CMake 默认的构建输出目录,包含所有 .o、.exe、.a 等编译产物
CMakeLists.txt.user文件Qt Creator 的工程配置文件,记录了编译选项、断点等 IDE 信息

这两个东西是 Qt/QML 工程中最常见的"垃圾文件"。build目录是体积大户,一个 Release 构建动辄几十上百 MB;.user文件则因人而异,提交到 Git 仓库时通常也会被.gitignore忽略。

脚本只会删除上述两类目标,其他所有文件 ——.cpp.qml.hCMakeLists.txt、资源文件、图片、文档等 —— 全部原封不动


三、脚本做了什么(详细说明)

脚本的实际行为可以拆解为以下几个层面:

3.1 环境准备

  • 设置UTF-8编码(chcp 65001),确保中文路径和提示信息正常显示。
  • 切换到脚本自身所在的目录(cd /d "%~dp0"),无论从哪里双击运行,都只清理脚本所在目录下的内容。
  • 启用延迟变量扩展(EnableDelayedExpansion),确保循环中变量值正确更新。

3.2 扫描与统计

  • 先遍历一级子目录,统计工程总数,显示进度条时使用。
  • 设置三个计数器:count(已删除数量)、errors(失败数量)、current(当前处理序号)。

3.3 清理当前目录

  • 当前目录下如果存在build文件夹,删除。
  • 当前目录下如果存在CMakeLists.txt.user文件,删除。
  • 这一步处理的是脚本直接所在目录的情况(比如脚本放在所有工程的根目录,而根目录本身也是一个 Qt 工程)。

3.4 遍历子目录清理

  • 遍历所有一级子目录,对每个目录执行相同的清理逻辑:
    • 删除子目录/build文件夹
    • 删除子目录/CMakeLists.txt.user文件
  • 每一步都有成功/失败的状态反馈。

3.5 统计报告

  • 输出清理统计:总工程数、成功删除数、失败数。
  • 如果有删除失败的情况(通常是权限不足或被其他进程占用),给出明确的警告提示。

四、脚本代码

@echo off setlocal EnableDelayedExpansion chcp 65001 >nul cd /d "%~dp0" echo ======================================== echo Qt Project Cleanup Tool echo ======================================== echo Base Directory: %cd% pause echo Start Time: %date% %time% echo. set count=0 set errors=0 set total_dirs=0 set current=0 REM Count total directories first for /d %%p in (*) do ( set /a total_dirs+=1 ) echo Found %total_dirs% project directories echo. echo ---------------------------------------- echo Starting cleanup... echo. REM Clean current directory first set "root_has_items=0" echo [ROOT] Processing current directory if exist "build" ( rd /s /q "build" 2>nul if errorlevel 1 ( echo [FAILED] build set /a errors+=1 ) else ( echo [DELETED] build set /a count+=1 set "root_has_items=1" ) ) if exist "CMakeLists.txt.user" ( del /f /q "CMakeLists.txt.user" 2>nul if errorlevel 1 ( echo [FAILED] CMakeLists.txt.user set /a errors+=1 ) else ( echo [DELETED] CMakeLists.txt.user set /a count+=1 set "root_has_items=1" ) ) if "!root_has_items!"=="0" ( echo [NO ITEMS] ) echo. REM Clean subdirectories for /d %%p in (*) do ( set /a current+=1 echo [!current!/%total_dirs%] Processing: %%p set "has_deleted=0" if exist "%%p\build" ( rd /s /q "%%p\build" 2>nul if errorlevel 1 ( echo [FAILED] %%p\build set /a errors+=1 ) else ( echo [DELETED] %%p\build set /a count+=1 set "has_deleted=1" ) ) if exist "%%p\CMakeLists.txt.user" ( del /f /q "%%p\CMakeLists.txt.user" 2>nul if errorlevel 1 ( echo [FAILED] %%p\CMakeLists.txt.user set /a errors+=1 ) else ( echo [DELETED] %%p\CMakeLists.txt.user set /a count+=1 set "has_deleted=1" ) ) if "!has_deleted!"=="0" ( echo [NO ITEMS] ) echo. ) echo ---------------------------------------- echo Cleanup Complete! echo. echo ============ Statistics ============ echo Total Projects: %total_dirs% echo Deleted: %count% items echo Failed: %errors% items echo End Time: %date% %time% echo ==================================== echo. if %errors% gtr 0 ( echo [WARNING] %errors% items failed to delete. Check permissions. echo. ) echo Press Enter to exit... pause endlocal

五、逻辑流程

整个脚本的执行流程如下:

关键设计决策:

  • 不递归进入子目录的子目录:只处理一级子目录。这是有意为之的,因为 Qt 工程通常是一级目录一个工程,深层嵌套会大幅增加风险和复杂度。如果确实需要更深层级的清理,可以手动调整或运行多次。
  • 存在性检查优先于删除:先if exist再执行删除,避免对不存在的路径误操作。
  • 逐条反馈,不留盲区:每一条删除操作都有明确的状态输出,用户随时可以检查日志,确认没有误删。
  • 失败不中断:某个文件/目录删除失败不会中断整个流程,而是记录错误数并在最后统一报告。

六、使用方法

运行效果:

  1. cleanup_projects.bat复制到你的 Qt 工程集合的根目录下。
  2. 双击运行,或者从命令行执行。
  3. 等待脚本执行完毕,确认统计信息无误。
  4. 按 Enter 退出,此时编译文件已被清空。

个人建议:

  • 放在所有工程的父目录运行,而不是每个工程里放一个。
  • 配合.gitignore使用,在仓库中忽略build/*.user文件,从根本上避免这类文件被提交。
  • 对于未来新建的 Qt 工程,建议统一设置CMAKE_BINARY_DIR到外部路径,从根源上避免编译产物散落在源码目录中。

七、下载

脚本下载链接:https://gitcode.com/u011186532/qml_demo/blob/main/cleanup_projects.bat

无需额外依赖,Windows 系统原生支持。


本脚本专为 Qt/QML 工程开发,适用于 Windows 平台。用于其他类型的 CMake 工程也可能有效,但请先确认清理目标是否合适。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 10:10:09

业绩报单系统:用一场“狂飙式”报单,点燃团队战斗力

保险销售的“开门红”,从来都不缺目标,缺的是能让目标看得见、跑起来的舞台。熹乐互动「荣耀III 收入大狂飙」业绩报单系统,就为这场福建保险人的目标之战,交出了一份亮眼答卷。在这场以“收入大狂飙”为主题的营销活动中&#xf…

作者头像 李华
网站建设 2026/5/9 10:07:19

为什么大家都在用 open claw

OpenClaw(俗称 “小龙虾”)是一款开源的本地 AI 智能体工具,主打本地运行与自主任务执行,能通过自然语言指令完成文件处理、浏览器操作、办公自动化等各类电脑任务,无需复杂编程,大幅提升工作效率。 下载地…

作者头像 李华
网站建设 2026/5/9 10:02:10

Cursor编辑器集成DeepSeek开源模型:AI编程助手自主化配置指南

1. 项目概述:当AI编程助手遇上开源模型最近在GitHub上看到一个挺有意思的项目,叫danilofalcao/cursor-deepseek。光看名字,可能很多开发者朋友已经猜到了它的核心:这是一个让 Cursor 编辑器能够调用 DeepSeek 系列大模型的插件或配…

作者头像 李华
网站建设 2026/5/9 10:02:08

打造高效心流体验:氛围感编码环境配置全攻略

1. 项目概述:一个为“氛围感编码”而生的资源宝库如果你和我一样,是个对工作环境、工具美学和流程仪式感有点“挑剔”的程序员,那么看到acvnace/awesome-vibe-coding-resources这个项目标题,大概率会会心一笑。这绝不是一个简单的…

作者头像 李华
网站建设 2026/5/9 10:01:29

第118篇:未来十年AI趋势前瞻——技术奇点、人机协作与商业范式转移(面试速览)

文章目录 考点概览 Q&A(含难度标注) Q1:什么是“技术奇点”?它在AI发展路径中是一个必然节点吗?(难度:★★★★) Q2:未来十年,人机协作的主要模式将如何演变?(难度:★★★★☆) Q3:AI将引发哪些根本性的商业范式转移?(难度:★★★★★) 易混淆对比 通用…

作者头像 李华