You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:08:57