调用File.Create创建关闭文件后立即读取提示进程无法访问如何解决
C# File.Create后读取文件报进程占用异常的解决方案
根因说明
你推测的原因正确:File.Create返回FileStream对象,即使显式调用Close(),也可能因操作系统文件句柄释放延迟、流资源释放不彻底导致文件被临时锁定。同时原逻辑创建空文件后直接读取空内容反序列化,必然会得到null值,存在冗余逻辑。
最优修复方案
直接省略手动创建文件的步骤,利用File.WriteAllText自带的自动创建文件逻辑,从根源避免文件锁问题,同时简化代码:
public SettingsModel LoadSettings() { var _fullPath = FileHelper.GetFullPath(_fileName); // 配置文件不存在时直接生成默认配置并写入 if (!File.Exists(_fullPath)) { var defaultSettings = new SettingsModel(); File.WriteAllText(_fullPath, JsonConvert.SerializeObject(defaultSettings)); return defaultSettings; } // 文件存在时正常读取反序列化 var serializedSettings = File.ReadAllText(_fullPath); return JsonConvert.DeserializeObject<SettingsModel>(serializedSettings) ?? new SettingsModel(); }
兼容原有逻辑的修复方案
如果必须保留先创建空文件的逻辑,使用using块包裹File.Create调用,确保流资源立即彻底释放:
public SettingsModel LoadSettings() { var _fullPath = FileHelper.GetFullPath(_fileName); if (!File.Exists(_fullPath)) { // using块会自动执行Dispose逻辑,彻底释放文件流资源 using (File.Create(_fullPath)) { // 可选:写入空的JSON结构,避免读空内容反序列化失败 File.WriteAllText(_fullPath, "{}"); } } var serializedSettings = File.ReadAllText(_fullPath); var settings = JsonConvert.DeserializeObject<SettingsModel>(serializedSettings); return settings ?? new SettingsModel(); }
额外说明
File.ReadAllText、File.WriteAllText这类静态方法内部已经封装了文件流的创建、读写、释放全流程,无需手动调用File.Create处理文件创建逻辑,直接使用即可规避绝大多数文件锁问题。
内容的提问来源于stack exchange,提问作者patrickgc
相关产品推荐
相关产品推荐

