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

C#中CSV文件追加写入时如何以只读模式打开文件?

解决C#追加CSV时文件被占用无法只读打开的问题

你的问题核心出在文件创建阶段的FileShare参数设置,结合写入逻辑优化即可解决:

问题根源

文件创建时使用了FileShare.None,这意味着在创建文件的整个过程中,其他进程完全无法访问该文件。即便创建完成后文件会自动关闭,但如果在创建过程中有程序尝试打开,就会触发"文件被占用"的错误。虽然数据更新阶段设置了FileShare.Read,但创建阶段的限制会导致首次创建时的访问冲突。

修正后的代码

文件创建部分

using (FileStream fileStream = new FileStream(csvFileName, FileMode.Create, FileAccess.Write, FileShare.Read))
{
    using (StreamWriter sr = new StreamWriter(fileStream))
    {
        for (int i = 0; i < 20; i++)
        {
            dataArray[i] = data[i];
        }
        // 立即刷新缓冲区,确保数据写入磁盘
        sr.Flush();
    }
}

数据更新部分

using (FileStream fileStream = new FileStream(csvFileName, FileMode.Append, FileAccess.Write, FileShare.Read))
{
    using (StreamWriter sr = new StreamWriter(fileStream))
    {
        sr.Write(csv_count++ + ",");
        for (int i = 0; i < 20; i++)
        {
            dataArray[i] = data[i].ToString();
        }
        sr.Write(string.Join(",", dataArray));
        // 立即刷新缓冲区,减少文件占用时长
        sr.Flush();
    }
}

关键说明

  • 将创建文件时的FileShare.None改为FileShare.Read,允许其他进程在文件创建过程中以只读模式访问。
  • 调用sr.Flush()确保写入的数据立即刷新到磁盘,避免StreamWriter的缓冲机制延长文件被占用的时间(虽然using块会自动处理,但主动Flush能进一步降低冲突概率)。
  • 数据更新阶段的FileShare.Read设置是正确的,保持不变即可,它允许其他进程在追加数据时只读打开文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:01