桌面应用开发工具【免费下载链接】winmergeWinMerge is an Open Source differencing and merging tool for Windows. WinMerge can compare both folders and files, presenting differences in a visual text format that is easy to understand and handle.项目地址https://gitcode.com/gh_mirrors/wi/winmerge点击查看免费下载导读WinMerge 的文件过滤器Filters是一套基于正则表达式的规则集合用于在文件比较与目录比较中只比较特定类型的文件或从目录差异中排除特定类型的文件。本文以仓库 Filters 目录下的模板与预置过滤器为骨架结合 Src/FileFilter.cpp、Src/FileFilterMgr.cpp、Src/FileFilterHelper.cpp 等源码系统讲解.flt过滤器的文件格式、全部指令前缀、包含/排除语义、正则匹配原理与加载目录帮助你编写出可直接投入实战的自定义过滤器。过滤器是什么WinMerge 的过滤器是一组运行时文件过滤规则。正如 Filters/README.md 所述它们允许用户只对某些类型的文件执行差异比较例如只比较.cpp/.h源码文件从目录差异中排除某些类型的文件例如排除*.obj、*.pdb等构建产物与.git、.svn等版本控制元数据目录。过滤器的核心载体是.flt格式的过滤器文件它由一段段“正则表达式 指令前缀”组成被 WinMerge 解析为内存中的规则对象在目录扫描阶段逐项判定文件与目录是否进入比较流程。过滤器的分发位置这些过滤器随 WinMerge 一起分发位于可执行文件下方的Filters子目录中。仓库中 Filters 目录下的全部.flt文件如Merge_VC_loose.flt、Merge_GnuC_loose.flt、XML_html.flt、CSharp_loose.flt等即对应这一运行时布局。从源码看实际加载路径不止一处详见下文「过滤器的加载目录」。.flt 过滤器文件语法编写过滤器的最佳起点是官方模板 Filters/FileFilter.tmpl它完整定义了语法骨架## This is a directory/file filter template for WinMerge name: ${name} desc: Longer description ## Select if filter is inclusive or exclusive ## Inclusive (loose) filter lets through all items not matching rules ## Exclusive filter lets through only items that match to rule ## include or exclude def: include ## Filters for filenames begin with f: ## Filters for directories begin with d: ## To exclude some of the files that match the f: pattern, specify f!: ## To exclude some of the folders that match the d: pattern, specify d!: ## (Inline comments begin with ## and extend to the end of the line) f: \.ext$ ## Filter for filename d: \\subdir$ ## Filter for directory头部元数据指令指令含义说明name:过滤器显示名称显示在 WinMerge 的过滤器下拉列表中缺省时以文件名作为默认名称desc:过滤器描述用于说明该过滤器的用途def:默认包含/排除语义取值见下表缺省为includedef:指令取值在解析源码 Src/FileFilterMgr.cpp 中有明确定义大小写不敏感取值语义include/yes/1宽松inclusive过滤器默认放行所有未命中规则的项目exclude/no/0严格exclusive过滤器默认只放行命中规则的项目规则前缀与正则表达式每条过滤规则由前缀 正则表达式组成模板中明确列出的前缀如下前缀作用对象含义f:文件匹配文件名/路径的包含规则d:目录匹配目录名的包含规则f!:文件排除规则在f:命中后进一步剔除指定文件d!:目录排除规则在d:命中后进一步剔除指定目录注释规则以##开头的行是整行注释行内##前面有空白起至行尾的内联注释同样被忽略这正是模板第 15 行所说明的约定。解析器 Src/FileFilterMgr.cpp 中的RemoveComment函数严格实现了这一行为只剔除前导空白后以##开头或由空白分隔的##注释段。正则表达式采用PCRE 语法由 Poco 库的Poco::RegularExpression编译执行。在 Src/FileFilter.cpp 中可以看到编译时固定附加了两个选项RE_CASELESS匹配时忽略大小写RE_UTF8按 UTF-8 编码处理文本。若表达式非法会记录FILTER_ERROR_INVALID_REGULAR_EXPRESSION错误并跳过该规则而不会导致整个过滤器加载失败。从源码看解析与匹配原理解析器一行一指令过滤器文件由 FileFilterMgr::LoadFilterFile 逐行解析除name:/desc:/def:外它还支持模板之外的更多前缀完整清单如下前缀归属规则列表说明f:文件包含正则见上文d:目录包含正则见上文f!:文件排除正则见上文d!:目录排除正则见上文fe:文件表达式过滤器基于属性表达式的文件规则de:目录表达式过滤器基于属性表达式的目录规则e:文件目录表达式过滤器同时加入文件与目录表达式列表fe!:/de!:/e!:对应排除列表带!的表达式排除变体每行解析时都会记录行号出错时错误信息中会携带行号、错误位置、出错源码文本与上下文见 Src/FileFilter.h 中的FileFilterErrorInfo结构便于定位问题行。匹配语义包含/排除的求值顺序文件或目录最终是否被放行由 FileFilter::TestFileNameAgainstFilter 等函数决定其核心逻辑为若文件名命中包含规则列表filefilters则进入下一步判断若此时存在排除规则filefiltersExclude且也命中则该文件被排除否则返回!default_include——即def: include时命中规则的项目被排除def: exclude时命中规则的项目被放行未命中任何规则的项目一律按default_include处理。目录判定走同构的 TestDirNameAgainstFilter。值得一提的是FileFilterElement构造时若正则中不含反斜杠与://字符会被标记为_fileNameOnly匹配时仅对文件名而非完整路径求值见 Src/FileFilter.h这使f: \.cpp$这类规则既能匹配根目录文件也能匹配子目录中的同名文件。表达式过滤器引擎fe:/de:/e:系列前缀对应 Src/FilterEngine 子项目——一个独立的表达式解析与求值引擎词法分析器由 FilterLexer.re 生成语法解析由 FilterParser.y 描述表达式在 FilterExpression.cpp 中被解析为语法树并求值。错误码体系定义在 Src/FilterEngine/FilterError.h涵盖未知字符、未闭合字符串、语法错误、无效正则、除零错误、非法属性名等 16 种情形。这类表达式可基于文件属性如大小、时间戳、行数做条件过滤是纯正则之外的能力补充。过滤器的加载目录与使用入口加载路径FileFilterHelper::LoadAllFileFilters 定义了过滤器的全部查找位置按序去重加载程序安装目录下的Filters子目录全局过滤器即 README 所述的分发位置%APPDATA%\WinMerge\Filters用户级过滤器我的文档\WinMerge\Filters用户级过滤器用户在选项对话框中自定义的过滤器目录。加载时以* 扩展名.flt作为通配模式扩展名常量定义于 Src/FileFilterHelper.hFileFilterMgr::LoadFromDirectory会扫描目录中所有匹配的.flt文件并逐个解析。此外ReloadUpdatedFilters 会通过比较文件修改时间与大小自动重载被编辑过的过滤器文件无需重启程序。在界面中的入口在 WinMerge 的目录比较视图中可通过过滤器下拉框/工具栏选择当前生效的过滤器选中Visual C loose之类的预置过滤器即可即时排除构建产物选择XML/HTML Devel这类def: exclude的严格过滤器则只比较 XML/HTML 开发者关心的文件类型。预置过滤器实战解析仓库 Filters 目录内置了一批可直接使用的过滤器覆盖常见开发场景Visual C loose宽松型排除 VC 构建产物Merge_VC_loose.flt 以def: include开头集中排除 Visual C 源码树中的各类二进制与中间文件例如f: \.aps$ ## VC Binary version of resource file, for quick loading f: \.obj$ ## VC object module file f: \.pdb$ ## VC program database file (debugging symbolic information) f: \.sdf$ ## SQL Server Compact Edition Database File f: \.VC.db$ ## VS Solution Database File目录部分则排除了版本控制与 IDE 工作区目录d: \\\.svn$ ## Subversion working copy d: \\\.git$ ## Git directory d: \\\.vs$ ## A hidden folder that stores .suo and *.db files d: \\ipch$ ## Intellisense cache for precompiled header file注意目录正则中的\\转义在 PCRE 中匹配路径分隔符\需要写成\\因此\\\.svn$实际匹配以.svn结尾的目录名。GNU C loose宽松型排除 GCC 构建产物Merge_GnuC_loose.flt 是同一思路的 GNU C 版本规则更精简f: \.o$ f: \.lib$ f: \.bak$ ## backup d: \\\.git$ ## Git directory d: \\\.hg$ ## Mercurial repositoryXML/HTML Devel严格型仅放行匹配文件XML_html.flt 演示了def: exclude的用法——默认拒绝一切只放行规则中列出的文件类型def: exclude f: \.xml$ ## XML files f: \.html$ ## HTML files f: \.css$ ## CSS style files f: \.js$ ## Java-script d: \\*$ ## Subdirectories其中d: \\*$用于放行所有子目录从而允许递归进入下层目录继续扫描这是严格型过滤器必须搭配的典型写法。Visual C# looseCSharp_loose.flt 在 VC 过滤器基础上补充了 C# 项目特有产物并排除了bin、obj输出目录f: \.cache$ f: \.resource$ ## Compiled resource file. d: \\bin$ ## binary files directory d: \\obj$ ## object files directory编写自定义过滤器的建议复制模板起步以 Filters/FileFilter.tmpl 为骨架填写name、desc并明确def: include或def: exclude。文件用f:、目录用d:文件规则匹配名称或路径目录规则匹配目录名二者不可混用需要“宽进严出”时用f!:/d!:追加排除。正则务必锚定文件名规则习惯以$结尾如\.obj$避免误伤my.obj.txt之类的文件。注意反斜杠转义匹配目录分隔符或 Windows 路径时\在正则中需写作\\如d: \\bin$。保存位置放入用户级目录%APPDATA%\WinMerge\Filters或我的文档\WinMerge\Filters即可被自动加载无需改动程序安装目录。即时生效修改已加载的.flt文件后WinMerge 会在检测到文件时间戳或大小变化时自动重载见 ReloadUpdatedFilters。校验语法非法正则与表达式错误会被记录为带行号的错误信息可通过过滤器相关对话框查看错误清单GetErrorList据此逐行修正。小结WinMerge 的过滤器系统以.flt文本文件承载规则通过f:/d:系列前缀与 PCRE 正则控制文件、目录的包含与排除并以def: include|exclude决定整体语义解析与匹配由 FileFilterMgr.cpp 与 FileFilter.cpp 在目录扫描阶段逐项执行。掌握模板语法、预置过滤器写法与加载目录规则即可针对任意项目定制差异比较范围让目录比较结果聚焦于真正关心的源码文件。赞分享桌面应用开发工具【免费下载链接】winmergeWinMerge is an Open Source differencing and merging tool for Windows. WinMerge can compare both folders and files, presenting differences in a visual text format that is easy to understand and handle.项目地址https://gitcode.com/gh_mirrors/wi/winmerge点击查看免费下载相关推荐告别冗余文件干扰WinMerge文件夹比对过滤器完全指南告别冗余文件干扰WinMerge文件夹比对过滤器完全指南 在使用WinMerge进行文件夹比对时你是否经常被大量无关文件如日志、缓存、编译产物淹没导致桌面应用开发工具WinMerge命令行参数完全指南高效文件与目录比较技巧WinMerge命令行参数完全指南高效文件与目录比较技巧 前言 WinMerge作为一款强大的开源文件比较和合并工具其命令行功能为自动化处理和集成提供了极大桌面应用开发工具本地AI文件整理终极指南简单三步让杂乱文件变整洁本地AI文件整理终极指南简单三步让杂乱文件变整洁 还在为电脑里杂乱无章的文件而烦恼吗Local File Organizer 是一款完全本地的AI智能文件管人工智能AI 应用本地部署上一篇MediaMTX与物联网集成传感器数据与视频流的融合方案下一篇TDDD实战教程从安装到运行PHPUnit测试的5分钟快速入门创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考