【问题标题】:Read file right after it was created and closed [duplicate]在创建和关闭文件后立即读取文件[重复]
【发布时间】:2021-08-07 10:16:32
【问题描述】:

通过 File.Create 创建文件后,我想在之后使用 File.ReadAllText 读取它。但是,我总是收到一个异常,指出该进程无法访问该文件。创建文件后,访问工作没有问题。 所以我假设文件在应该被读取的时候还没有被 File.Create 发布。我该如何解决这个问题?下面是我的方法。

    public SettingsModel LoadSettings()
    {
        var _fullPath = FileHelper.GetFullPath(_fileName);
        if (!File.Exists(_fullPath))
        {
            File.Create(_fullPath).Close();
        }
        var serializedSettings = File.ReadAllText(_fullPath);
        var settings = JsonConvert.DeserializeObject<SettingsModel>(serializedSettings);

        if (settings == null)
        {
            return new SettingsModel();
        }
        else
        {
            return settings;
        }
    }

【问题讨论】:

标签: c# file


【解决方案1】:

您创建一个空文件以在之后对其进行反序列化。只有文件存在时才能执行反序列化:

public SettingsModel LoadSettings()
{
    var _fullPath = FileHelper.GetFullPath(_fileName);
    var settings = File.Exists(_fullPath) 
        ? JsonConvert.DeserializeObject<SettingsModel>(File.ReadAllText(_fullPath))
        : new SettingsModel();
    return settings;
}

【讨论】:

  • 虽然这没问题,但真正的问题是,您无法在创建后立即从文件中读取(但是,我总是收到一个异常,指出进程无法访问该文件)
  • File.Create 返回一个(打开的)流,因此您必须在阅读之前关闭返回的流:using (var fs = File.Create("myFile.txt")) { } var content = File.ReadAllText("myFile.txt");
  • File.Create(...).Close() 也会关闭文件。我也会把它放在 using 块中,但在这种情况下,文件不能保持打开状态。如果 File.Create 失败,则没有要关闭的流。
  • 不幸的是,这也不能解决我的问题。
  • 我必须道歉,错误是在耳朵之间。在 GetFullPath 方法中,我已经检查了文件是否存在并在必要时创建它。我仍然感谢大家的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2017-09-23
相关资源
最近更新 更多