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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:06:03