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

