大家好,我是 SiKi老师。交付资源清单时,Characters/Hero.png和characters/hero.png应不应该算同一项?如果团队约定路径忽略大小写,就需要先报告这两个名称,不能在生成字典时悄悄留下一个。
本文用 Windows、Python 3.12.14 的自拟字符串列表独立实测。不创建大小写冲突的真实文件,不读取游戏工程,也没有验证 Unity 或 Godot 导入行为。这里的比较规则是工具约定,不是操作系统文件名规则。
一 先写明你比较的是完整相对路径
这份练习清单统一使用/分隔路径,输入已经是约定好的相对路径字符串。Characters/Hero.png和Effects/Hero.png的末尾名称相同,所在目录不同。本例不把它们视为冲突。
如果只取最后的Hero.png,目录信息就丢了;如果不说明比较范围,协作者也无法判断报告是在说“全项目不能同名”,还是“完整路径不能只差大小写”。两种约定都可以讨论,但不能混着使用。
本例不会对反斜杠、绝对路径、空白、.、..或 Unicode 规范化进行预处理。真实输入不符合清单协议时,应另行拒绝或按明确规则处理,然后再检查碰撞。不能用一段比较代码宣称已经完成路径安全校验。
二 原始名称要保留,比较键另算
Python 3.12 字符串文档 给出casefold()用于忽略大小写匹配。本文选择它作为比较键,但保留原字符串,便于报告需要核对的两项。
fromcollectionsimportCounter,defaultdictdefreport_names(names):exact={name:countforname,countinCounter(names).items()ifcount>1}buckets=defaultdict(set)fornameinnames:buckets[name.casefold()].add(name)collisions={key:sorted(values)forkey,valuesinbuckets.items()iflen(values)>1}returnexact,collisions一个桶里只有一种原始写法,不算大小写碰撞。若同一个原始字符串出现多次,set会折叠它,所以代码先用Counter单独记下精确重复。把这两类报告分开,才能分清是清单重复收集,还是出现了不同写法。
sorted这里只让一个碰撞组的原始写法按字符串顺序展示,方便读报告;它不决定哪份资源应该保留,也没有改变输入列表。
三 用两种重复检查报告内容
names=['Characters/Hero.png','characters/hero.png','UI/Icon.png','UI/Icon.png','Effects/Hero.png']exact,collisions=report_names(names)print(exact)print(collisions)独立运行得到:
{'UI/Icon.png': 2} {'characters/hero.png': ['Characters/Hero.png', 'characters/hero.png']}UI/Icon.png原样出现两次;另外两项在选定比较键下碰撞。Effects/Hero.png没有进入碰撞组,因为完整路径不同。这个结果只说明名称关系,没有证明文件存在,也没有读取图片内容。
我还对['A/Hero.png', 'B/Hero.png']和空列表作了断言,两类报告都为空。空列表没有发现冲突,不代表项目已经交付齐全:输入是不是漏扫了目录,是另一项检查。
四 casefold 不能冒充文件系统判断
这套工具规则比简单处理 ASCII 大小写的范围更广。实测Straße.png与STRASSE.png的casefold键相同。团队若不希望这些名称被归为同组,就需要重新定义比较规则,不能把函数名当作协议。
本例未验证不同文件系统的大小写敏感设置、Unicode 等价形式或引擎资源 ID。报告也不意味着两个路径在本机一定指向同一文件。文章没有承诺这份检查能保证跨平台构建成功。
这里的“冲突”准确含义是:两个不同原始字符串,在本文选定的比较键下相同。报告中应保留这个定义,避免协作者误以为工具发现了物理文件覆盖。
五 发现冲突先暂停交付,不自动改名
检查结果交给资源负责人核对:两项是否有意分别存在、清单引用是否一致、团队命名约定究竟是什么。确认之后再安排改名和引用更新。本文代码只返回报告,不移动、删除或覆盖任何文件。
也别为了让检查通过,直接把每个名称转为小写写回清单。那会丢掉原始写法,引用能否继续有效并没有在本例中得到验证。即使两份文件内容相同,是否可以合并仍是项目层面的决定。
完整清单、名称检查和引擎验收各有自己的证据。本例只验证五个自拟名称的分组与几个边界断言,没有测大规模扫描或并发变化。你准备让团队遵守精确匹配,还是忽略大小写匹配?把约定放在清单说明里,再解释这份报告。