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
相关产品推荐
相关产品推荐

