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

在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;
}

关键说明

  1. 计数器维护规则:
    • 调用output.WriteLine时,每执行一次就将lineCount加1,因为该方法会自动添加换行符,代表一行结束。
    • 如果必须用output.Write且内容包含换行符,需要额外统计换行符数量更新计数器(比如lineCount += line.Split('\n').Length - 1),建议优先用WriteLine简化统计逻辑。
  2. 路径修正:原代码路径拼接会生成C:\a.txt\fileName这类无效路径,改用Path.Combine保证路径格式合法。
  3. 补行逻辑优化:直接用取模运算计算余数,替代Math.DivRem让代码更简洁。

内容的提问来源于stack exchange,提问作者Kumas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22