Я работаю над проектом C #, в котором у меня есть несколько файлов конфигурации. Каждый из этих файлов содержит объект JSON. В течение всего жизненного цикла программы эти файлы могут быть прочитаны или записаны в различные моменты.
Эта программа управляет промышленной машиной, которую по разным причинам можно отключить в любой момент. Выключение машины приводит к мгновенному выключению компьютера, на котором запущена моя программа. Компьютер работает под управлением Windows 10 Pro x64 с SSD в формате NTFS.
Когда машина включена и, таким образом, моя программа перезапускается, она выдает исключение при чтении файла конфигурации, сообщающего, что файл не содержит объекта JSON. Когда я открываю файл с помощью Блокнота, файл действительно «пустой».
Например, вместо объекта JSON:
{
«ключ»: значение
}
У меня есть следующий контент:
NULNULNULNULNULNULNULNUL и т. Д.
Свойства файла показывают одинаковый размер файла, независимо от того, содержит ли он объект JSON или «пуст», то же самое относится и к размеру на свойстве диска.
У меня есть другие файлы конфигурации, которые читаются и пишутся, но в виде простого текста, на которые это не влияет.
Эта проблема не возникает при каждом выключении / включении питания и не влияет на каждый файл конфигурации. В основном он появляется с тем же файлом, но не всегда.
Я проверял, правильно ли закрываются файлы конфигурации, когда я их читаю или пишу:
Чтение файла:
JObject jsondata = JObject.Parse (File.ReadAllText (Path));
Записать файл:
File.WriteAllText (Path, jsondata.ToString ());
Оба метода (ReadAllText и WriteAllText) указывают, что они открывают, читают и закрывают файл.
Эти методы окружены предложениями try catch, и у меня никогда не возникало проблем с неправильной структурой JSON или NULL-объектом. Если я прав, даже объект NULL JSON записал бы в файл хотя бы скобки {}.
Я попытался программно сделать резервную копию моих файлов конфигурации в другой папке. Резервное копирование файлов выполняется без чтения файлов (с использованием метода File.Copy ()):
Периодически (каждые 10 минут) обновляйте файлы резервных копий самыми последними файлами конфигурации.
Если файл конфигурации «пустой» (проверяя, все ли байты в файле равны 0), замените его соответствующим файлом резервной копии.
// Check if any file has been modified since last check
for (int file = 0; file < Directory.GetFiles(_FolderToBackup).Length; ++file)
{
// Get file to check
string FilePath = Directory.GetFiles(_FolderToBackup)[file];
string FileName = Path.GetFileName(FilePath);
// Check if backup file with same name exists in Backup folder
if (BackupFileExist(FileName))
{
// File path to backup file
string BackupFilePath = _BackupFolder + "\\" + FileName;
// If backup file is empty
if (isFileEmpty(BackupFilePath))
{
Log.Write("File " + FilePath + " is empty");
// Copy file to backupfolder, we don't have to check if file to backup is empty, because destination is already empty !
File.Copy(FilePath, BackupFilePath, true);
}
// If file to backup is empty
if (isFileEmpty(FilePath))
{
Log.Write("File " + FilePath + " is empty");
// Copy backup file back to folder to backup
File.Copy(BackupFilePath, FilePath, true);
}
// If no file is empty, update only files that have been modified since last check
if(new FileInfo(FilePath).LastWriteTime > new FileInfo(BackupFilePath).LastWriteTime)
{
File.Copy(FilePath, BackupFilePath, true);
}
}
// If backup file does not exist
else
{
string BackupFilePath = Path.Combine(_BackupFolder, FileName);
File.Copy(FilePath, BackupFilePath);
}
}
Этот поворот работает отлично, когда файл конфигурации "пуст".
Однако иногда, когда я выключал / включал компьютер, и файл конфигурации, и файл резервной копии были пустыми.
Мне также удалось один раз получить пустой файл конфигурации при перезапуске машины, даже если отключение питания происходило, когда мой код не работал.
На данный момент, я не знаю, связана ли моя проблема с выключением / включением питания или с тем, как я читаю / записываю свои файлы:
Почему это происходит, когда компьютер выключается / включается?
Почему это влияет только на мои файлы конфигурации JSON?
Почему файлы очищаются и не портятся?
Почему это происходит, даже если файл не открыт в моей программе?
Большое спасибо за ваше время.