Файл настроек поврежден, как и файл резервной копии - PullRequest
0 голосов
/ 26 января 2019
    /// <summary>
    /// Save settings to config file. Create backup of current settings
    /// </summary>
    public void SaveSettings()
    {
        Directory.CreateDirectory(CONFIG_DIRECTORY);

        // move current settings file to backup
        if (File.Exists(SettingsFile))
        {
            if (File.Exists(SettingsBackupFile)) // delete prev backup
                File.Delete(SettingsBackupFile);

            File.Move(SettingsFile, SettingsBackupFile);
        }

        // Create new settings file
        using (var f = (TextWriter)File.CreateText(SettingsFile))
        {
            f.WriteLine(JsonConvert.SerializeObject(_settings, Formatting.Indented));
            f.Close();
        }
    }

Я переименовываю текущий файл настроек в файл .bak, а затем заменяю текущий файл настроек.Я делаю это, потому что мои файлы могут / будут повреждены, если пользователь отключит питание во время загрузки.Я думал, что этот шаблон проектирования будет работать так, как я мог бы прочитать из резервной копии, если файл настроек поврежден, но файл резервной копии также поврежден.

1 Ответ

0 голосов
/ 26 января 2019

При записи файлов данные поступают в кэш обратной записи ОС.Когда ОС неожиданно дает сбой (отключение питания, синий экран, уничтожение виртуальной машины), данные теряются.Типичным симптомом является то, что файл имеет правильный размер, но заполнен нулями.(Возможно, размер также может быть неправильным, я не знаю.)

В общем, идея записи в новый файл, а затем замены новых и старых файлов является хорошей стратегией.Но вам также необходимо сбросить данные на диск.

FileStream.Flush() и StreamWriter.Flush().Скорее всего, вы должны добавить f.Flush();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...