我正在开发一个C项目,其中我有几个配置文件。每个文件都包含一个JSON对象。在程序的整个生命周期中,可以在不同的时刻读取或写入这些文件。
这个程序管理一台工业机器,由于各种原因,可以随时关闭它。关闭机器会立即关闭正在运行我的程序的计算机。计算机正在运行带有NTFS格式的SSD的Windows 10 Pro x64。
当机器打开,因此我的程序重新启动时,它在读取一个配置文件时抛出一个异常,告诉该文件不包含任何JSON对象。当我用记事本打开文件时,文件实际上是“空的”。
例如,不使用JSON对象:
{
“关键”:价值
}
我有以下内容:
努努努努努努努努尔等
文件的属性显示相同的文件大小,不管它是否包含JSON对象或是“空的”,磁盘上的大小属性也是如此。
我有其他读写的配置文件,但它们是纯文本,不受影响。
此问题不会在每次关机/开机时出现,也不会影响每个配置文件。它通常显示在同一个文件中,但并不总是如此。
我检查了配置文件在读写时是否正确关闭:
读取文件:
jobject jsondata=jobject.parse(file.readalltext(path));
写入文件:
file.writeAllText(path,jsondata.toString());
这两种方法(readAllText和writeAllText)都指定它们打开、读取和
关闭
文件。
这些方法被try-catch子句包围,我从未遇到过错误的JSON结构或空对象的问题。如果我是正确的,即使是一个空的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);
}
}
当配置文件为“空”时,这种转换非常有效。
但是,有时当我关闭/打开机器时,配置文件和它的备份文件都是空的。
我也曾在机器重新启动时设法获得一个空的配置文件,即使在我的代码没有运行时断电。
此时,我不知道我的问题是否与关机/开机或我读/写文件的方式有关:
非常感谢你抽出时间来。