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

创建带StreamWriter的TextWriter遇文件占用异常,C# .NET如何解决?

解决文件被占用时的C# .NET写入问题

针对文件被其他进程占用导致StreamWriter创建失败的情况,提供以下几种实用方案:

方案1:写入临时文件后替换原文件

这是最可靠的方案,避免直接操作被锁定的原文件:

XmlSerializer _serializer = new XmlSerializer(typeof(T));
string tempFilePath = Path.GetTempFileName();

// 先写入临时文件
using (TextWriter _writer = new StreamWriter(tempFilePath))
{
    _serializer.Serialize(_writer, XMLSettings);
}

// 替换原文件(若原文件仍被占用,此步骤仍会失败,可根据需求添加重试)
try
{
    // 先删除原文件(如果存在),再移动临时文件
    if (File.Exists(filePathName))
    {
        File.Delete(filePathName);
    }
    File.Move(tempFilePath, filePathName);
}
catch
{
    // 处理替换失败的情况,比如清理临时文件
    File.Delete(tempFilePath);
    throw;
}

方案2:指定文件共享权限打开

通过FileStream显式设置共享权限,尝试在允许其他进程访问的前提下写入:

XmlSerializer _serializer = new XmlSerializer(typeof(T));

// 使用FileStream指定共享模式,允许其他进程读写该文件
using (FileStream fs = new FileStream(filePathName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
using (TextWriter _writer = new StreamWriter(fs))
{
    _serializer.Serialize(_writer, XMLSettings);
}

注:如果其他进程是独占锁定文件,此方案仍会失败,仅适用于其他进程以共享模式打开文件的场景。

方案3:添加重试逻辑

如果文件被占用是临时状态(比如其他进程短时间内会释放),可以添加重试机制:

XmlSerializer _serializer = new XmlSerializer(typeof(T));
int retryCount = 3;
int delayMs = 500;

for (int i = 0; i < retryCount; i++)
{
    try
    {
        using (TextWriter _writer = new StreamWriter(filePathName))
        {
            _serializer.Serialize(_writer, XMLSettings);
        }
        return; // 成功写入,退出方法
    }
    catch (IOException) when (i < retryCount - 1)
    {
        Thread.Sleep(delayMs); // 等待一段时间后重试
    }
}

// 重试失败,抛出原异常
throw new IOException("多次尝试写入文件均失败,文件可能被其他进程持续占用。");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:30:43