Archive Используется приложениями при выполнении резервного копирования, а в
некоторых случаях при удалении старых файлов
Compressed Файл является сжатым
Directory Объект файловой системы является каталогом
Encrypted Файл является зашифрованным
Hidden Файл является скрытым
Normal Файл находится в обычном состоянии, и для него установлены любые другие
атрибуты. Этот атрибут не может использоваться с другими атрибутами
Offline Файл, расположенный на сервере, кэширован в хранилище на клиентском
компьютере. Возможно, что данные этого файла уже устарели
ReadOnly Файл доступен только для чтения
System Файл является системным
Листинг 11.10 демонстрирует использование класса FileInfo для копирования всех файлов с расширением jpg из каталога d:\foto в каталог d:\temp. Метод Exists позволяет проверить, существует ли исходный каталог.
Листинг 11.10. Копирование файлов
using System;
using System.IO;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
try
{
string DestName = @"d:\temp\";
DirectoryInfo dest = new DirectoryInfo(DestName);
dest.Create(); // создание целевого каталога
DirectoryInfo dir = new DirectoryInfo(@"d:\foto");
if (!dir.Exists) // проверка существования каталога
{
Console.WriteLine("Каталог " +
dir.Name + " не существует"); return;
}
FileInfo[] files = dir.GetFiles("*.jpg"); //список файлов
foreach (FileInfo f in files)
f.CopyTo(dest + f.Name); // копирование файлов
Console.WriteLine("Скопировано " +
files.Length + " jpg-файлов");
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
}
}
}
Использование классов File и Directory аналогично, за исключением того, что их методы являются статическими и, следовательно, не требуют создания объектов.
Сохранение объектов (сериализация)
В С# есть возможность сохранять на внешних носителях не только данные примитивных типов: но и объекты. Сохранение объектов называется сериализацией, а восстановление сохраненных объектов — десериализацией. При сериализации объект преобразуется в линейную последовательность байтов. Это сложный процесс, поскольку объект может включать множество унаследованных полей и ссылки на вложенные объекты, которые, в свою очередь, тоже могут состоять из объектов сложной структуры.
К счастью, сериализация выполняется автоматически, достаточно просто пометить класс как сериализуемый с помощью атрибута [Serializable]. Атрибуты рассматриваются в главе 12, пока же достаточно знать, что атрибуты — это дополнительные сведения о классе, которые сохраняются в его метаданных. Те поля, которые сохранять не требуется, помечаются атрибутом [NonSerialized], например:
[Serializable]
class Demo
{
public int a = 1;
[NonSerialized]
public double y;
public Monster X, Y;
}
Объекты можно сохранять в одном из двух форматов: двоичном или SOAP (в виде XML-файла). В первом случае следует подключить к программе пространство имен System.Runtime.Serialization.Formatters.Binary, во втором — пространство System.Runtime.Seria1ization.Formatters.Soap.
Рассмотрим сохранение объектов в двоичном формате. Для этого используется класс BinaryFormatter, в котором определены два метода:
Serialize(поток, объект):
Deserialize(поток);
Метод Serialize сохраняет заданный объект в заданном потоке, метод Deserialize
восстанавливает объект из заданного потока.
В листинге 11.11 объект приведенного ранее класса Demo сохраняется в файле на
диске с именем Demo.bin. Этот файл можно просмотреть, открыв его, к примеру,
в Visual Studio.NET.