在StreamWriter作用域内统计文件总行数并补全行数的问题
解决StreamWriter作用域内统计文件行数的文件占用问题
问题根源
当StreamWriter处于using作用域内时,文件会被该进程独占锁定,此时调用File.ReadLines尝试读取同一份文件,必然触发"进程无法访问文件,因为该文件正由另一进程使用"的异常。
最优解决方案
无需事后读取文件统计行数,在写入过程中主动维护一个行数计数器即可,全程无需二次读取文件,彻底避免文件冲突。
修改后的代码
private string CreateAndPushFile(string fileName) { // 修正路径拼接(原代码路径逻辑错误,C:\\a.txt是文件而非目录) string outputDir = @"C:\"; string outputFilePath = Path.Combine(outputDir, fileName); int lineCount = 0; // 主动维护行数计数器 using (StreamWriter output = new StreamWriter(outputFilePath)) { // 写入文件头(无换行,不增加行数) string fileHeader = "kjhakljdhkjhkj"; output.Write(fileHeader); // 写入批次控制(无换行,不增加行数) string batchControl = "1515151"; output.Write(batchControl); // 替换为你的实际业务逻辑:循环写入多行 var dataLines = new List<string> { "line1", "line2", "line3" }; foreach (var line in dataLines) { output.WriteLine(line); lineCount++; } // 写入文件控制行(WriteLine触发换行,行数+1) string fileControl = "3123123"; output.WriteLine(fileControl); lineCount++; // 计算需要补充的行数,使总行数为10的倍数 int remainder = lineCount % 10; if (remainder != 0) { int linesToAdd = 10 - remainder; for (int i = 0; i < linesToAdd; i++) { output.WriteLine("9999999999999"); } } } return outputFilePath; }
关键说明
- 计数器维护规则:
- 调用
output.WriteLine时,每执行一次就将lineCount加1,因为该方法会自动添加换行符,代表一行结束。 - 如果必须用
output.Write且内容包含换行符,需要额外统计换行符数量更新计数器(比如lineCount += line.Split('\n').Length - 1),建议优先用WriteLine简化统计逻辑。
- 调用
- 路径修正:原代码路径拼接会生成
C:\a.txt\fileName这类无效路径,改用Path.Combine保证路径格式合法。 - 补行逻辑优化:直接用取模运算计算余数,替代
Math.DivRem让代码更简洁。
内容的提问来源于stack exchange,提问作者Kumas
相关产品推荐
相关产品推荐

