Как проверить является ли XML файл пустым? Язык C#
Для сериализации и десериализации использую XmlSerializer. При запуске программа должна считать определенную информацию, но если файл с которого она считывает является пустым, то выполнение останавливается. Что нужно: проверить является ли файл пустым и если он не пустой то считать информацию.
Вот мои методы для записи и считывания информации:
/// <summary>
/// Serialize all clients to xml file
/// </summary>
public void WriteToXml()
{
// Formatter for List<Clients>
XmlSerializer formatter = new XmlSerializer(typeof(List<Client>));
// Stream wich will write all data to file DataClients.xml
using (FileStream fs = new FileStream("DataClients.xml", FileMode.OpenOrCreate))
{
formatter.Serialize(fs, Clients);
}
}
/// <summary>
/// Deserialize all clients to List<Clients> when programm start
/// </summary>
public void WriteFromXml()
{
// Formatter for List<Clients>
XmlSerializer formatter = new XmlSerializer(typeof(List<Client>));
// All clients will deserialize from "DataClients.xml" to Clients.
using (FileStream fs = new FileStream("DataClients.xml", FileMode.OpenOrCreate))
{
Clients = (List<Client>)formatter.Deserialize(fs);
}
}
Ответы (2 шт):
Чтобы узнать информацию о файле, можно использовать System.IO.FileInfo.
Так же при работе с файлом могут возникнуть и другие ошибки, например отвалится диск, какое-то другое приложение захватит файл в момент между проверкой и и открытием файла на чтение или запись. Вероятность критически мала, но это может произойти, поэтому стоит дополнительно обрабатывать исключания, возникающие при работе с файлами.
Некоторые разработчики считают, что зачем проверка существования файла, если это можно обработать просто как исключение. Так можно, да, убрать проверки и просто начать работу с файлом внутри блока try-catch, я же считаю, что минимально проверить Exists стоит, если отсутствие файла - не является исключительной ситуацией по логике приложения. Проверку, пустой он или нет не стоит делать, если вы не создаете этот файл пустым никогда, и не считаете такую ситуацию нормальной.
FileInfo fi = new FileInfo("DataClients.xml");
if (fi.Exists && fi.Length > 0)
{
try
{
using (FileStream fs = fi.OpenRead())
{
//...
}
}
catch (Exception ex)
{
// обработать исключение, например вывести в консоль сообщение об ошибке
Console.WriteLine(ex.Message);
}
}
Для записи можно использовать fi.Create().
Я бы посоветовал просто обернуть код в try/catch, и ловить исключения.
В случае, если файл пустой, или файла нет, или у вас нет прав на доступ к файлу, или файл оказался каталогом, или в файле невалидный XML, или удалённая файловая система отвалилась по сетевому таймауту, или... (ad nauseam) вы получите исключение, которое вам нужно будет правильно проинтерпретировать.
Предварительные проверки не спасают полностью, т. к. приведут к race condition: вы не контролируете файл, а значит, не можете рассчитывать, что процесс чтения не взбрыкнёт в самый последний момент. Файл может оказаться пустым сразу после всех ваших проверок.
Дополнительное чтение по теме: Eric Lippert, Vexing exceptions.