StreamReader未读取全部行问题求助:SHA2哈希校验工具故障排查
嘿,我之前也碰到过类似的StreamReader读取不全的问题,给你几个排查方向和实用解决方案试试:
可能的原因与解决办法
1. 换行符不匹配导致漏读
不同系统的换行符格式不一样:Windows用\r\n,Linux/macOS用\n,如果黑名单文件的换行符和你代码里默认处理的不匹配,ReadLine()就可能跳过部分行。
推荐直接读取全部内容再分割,兼容所有换行格式:
// 读取全部内容后按所有可能的换行符分割,同时移除空行 var blacklistContent = File.ReadAllText("blacklist.txt"); var hashList = blacklistContent.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
2. 文件编码错误导致读取异常
如果你的黑名单文件不是UTF-8编码(比如GBK、ANSI),用StreamReader默认的UTF-8读取会出现乱码,进而导致部分行无法被正确识别。
可以指定编码读取,或者用更简洁的File.ReadAllLines:
// 指定编码读取全部行 var hashList = File.ReadAllLines("blacklist.txt", Encoding.GetEncoding("GBK"));
3. 流未正确释放导致读取中断
如果没有用using语句包裹StreamReader,可能会因为流提前被关闭,导致没读完所有行。一定要确保StreamReader在using块中,它会自动帮你释放资源:
using (var sr = new StreamReader("blacklist.txt")) { string line; while ((line = sr.ReadLine()) != null) { // 将每行哈希添加到集合中 } }
4. 优化建议:用HashSet提升比对效率
另外,比对哈希的时候,建议把黑名单哈希存入HashSet<string>,比用List<string>的Contains方法快得多,尤其是黑名单条目较多的时候:
// 加载黑名单到HashSet var blacklistHashes = new HashSet<string>(File.ReadAllLines("blacklist.txt")); // 计算文件哈希后直接比对 var fileSHA2 = CalculateFileSHA2(selectedFilePath); var isDirty = blacklistHashes.Contains(fileSHA2);
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

