C#跨平台(Windows/树莓派Mono)文件列表移除异常排查求助
嘿,我来帮你梳理下这台特殊树莓派上的问题排查方向,先从代码本身的潜在坑说起,再结合Mono和树莓派的环境特性分析:
一、先检查代码逻辑的隐患
你的循环写法有个容易踩的问题:在循环中修改数组长度时,索引会发生混乱。每次执行RemoveAt(i)后,数组长度减1,后面的元素会自动前移,但你的i还在持续递增,这会导致跳过下一个元素;而且每次循环都重新创建List实例,不仅效率低,还可能出现意外的匹配遗漏。比如如果有多个含"alltimelog"的文件,第二个就可能被跳过,根本不会触发if判断里的日志。
建议先把数组转成List后倒序遍历(避免索引偏移问题),或者直接用LINQ简化逻辑,这样更可靠:
优化后的代码示例
// 方案1:用LINQ一步过滤,简洁不易出错 MonthfileList = Directory.GetFiles("data/", "*log.txt") .Where(filePath => !filePath.Contains("alltimelog")) .ToArray(); // 方案2:保留日志输出,倒序遍历List避免索引混乱 var fileList = new List<string>(Directory.GetFiles("data/", "*log.txt")); for (int i = fileList.Count - 1; i >= 0; i--) { if (fileList[i].Contains("alltimelog")) { Sup.LogDebugMessage($"MonthfileList removing: {fileList[i]}"); fileList.RemoveAt(i); } } MonthfileList = fileList.ToArray();
二、树莓派Mono环境特有的排查方向
如果代码在其他机器正常,这台树莓派出问题,大概率是环境差异导致的:
大小写敏感问题:树莓派使用的ext4文件系统是大小写敏感的,而Windows是不区分的。如果这台树莓派上的目标文件名是
AllTimeLog.txt或ALLTIMELOG.txt,你的Contains("alltimelog")是大小写敏感的判断,自然匹配不到。可以改成忽略大小写的判断:if (fileList[i].IndexOf("alltimelog", StringComparison.OrdinalIgnoreCase) >= 0)Mono版本差异:不同树莓派的Mono版本可能不一样,旧版本的Mono在处理
Directory.GetFiles或字符串匹配时可能存在bug。运行mono --version查看这台机器的版本,和正常运行的树莓派对比,尝试升级Mono到最新稳定版。文件列表完整性验证:可以在循环开头加日志,输出所有
MonthfileList[i]的内容,确认alltimelog相关的文件是否真的被枚举到了——比如有没有可能该文件因权限问题没被Directory.GetFiles获取到?字符串编码异常:极端情况下,如果文件名包含非ASCII的相似字符(比如全角/半角差异),会导致
Contains匹配失败。可以在日志里输出文件名的完整字符串(甚至转成字节数组),对比正常机器上的文件名编码。
三、快速验证步骤
- 在循环开头加日志,输出所有获取到的文件名,确认目标文件是否在列表中;
- 临时把判断改成忽略大小写,看是否能触发日志输出;
- 替换成优化后的代码,排查是否是索引问题导致的漏判。
内容的提问来源于stack exchange,提问作者Hans Rottier

