Создание подкаталога в заданном каталоге 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание подкаталога в заданном каталоге



DirectoryInfo di2 = di.CreateSubdirectory("SubDir");

Удаление каталога

di1.Delete();

Если удаляемый каталог не пуст, возникает исключение.

Перемещение (переименование) каталога

di.MoveTo(@"c:\NewTempDir");

Этот метод не позволяет перемещать каталог на другой диск (для этого придется «вручную» заняться всем содержимым каталога).

Работа с файлами

Для выполнения задач, связанных с файлами, можно использовать класс FileInfo.

Для получения списка файлов в папке используется статический метод GetFiles класса DirectoryInfo.

У методов GetDirectories и GetFiles имеется перегруженный вариант со вторым параметром, в котором можно задать шаблон (маску) интересующих папок или файлов. Например, Directory.GetFiles(@"d:\MyWork", "*.doc") вернет массив с именами Word-файлов в папке d:\MyWork.

 

 

Запись в текстовый файл
// оператор using автоматически закрывает StreamWriter using (StreamWriter sw = new StreamWriter("TestFile.txt")) { // Добавить в файл некоторый текст sw.Write("Это "); sw.WriteLine("заголовок файла."); // В могут быть записаны объекты sw.WriteLine(DateTime.Now); }
Чтение из текстового файла
try { // оператор using автоматически закрывает StreamReader using (StreamReader sr = new StreamReader("TestFile.txt")) { String line; // читать и показывть строки из файла пока не конец while ((line = sr.ReadLine())!= null)  Console.WriteLine(line); } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); }
Добавление в текстовый файл
Так же как запись в файл, но объект StreamWriter создается: FileInfo fi=new FileInfo("log.txt"); StreamWriter sw = FileInfo.AppendText(); либо StreamWriter sw = new StreamWriter("TestFile.txt",true);
Перебор файлов каталога и определение размера файла
DirectoryInfo di = new DirectoryInfo("c:\\"); // получить ссылку на каждый файл каталога FileInfo[] fiArr = di.GetFiles(); // Показать имена и размеры файлов Console.WriteLine("Каталог {0} содержит файлы:", di.Name); foreach (FileInfo f in fiArr) Console.WriteLine("Размер {0} - {1} байт.",f.Name,f.Length);
Получение и изменение атрибутов файла В примере методы GetAttributes и SetAttributes применяют к файлу атрибуты Archive и Hidden (применяется техника битовых масок).
string path = @"c:\temp\MyTest.txt"; // Создать файл, если он не существует if (!File.Exists(path)) File.Create(path); if ((File.GetAttributes(path) & FileAttributes.Hidden) ==   FileAttributes.Hidden) { // Показать файл File.SetAttributes(path, FileAttributes.Archive); Console.WriteLine("Файл {0} теперь виден.", path); } else { // Скрыть файл File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Hidden); Console.WriteLine("Файл {0} скрыт.", path); }
Чтение и запись в бинарный файл
private const string FILE_NAME = "Test.data"; public static void Main(String[] args) { // создать новый пустой файл. if (File.Exists(FILE_NAME)) { Console.WriteLine("{0} already exists!", FILE_NAME); return; } FileStream fs=new FileStream(FILE_NAME,FileMode.CreateNew); BinaryWriter w = new BinaryWriter(fs); for (int i = 0; i < 11; i++) w.Write((int) i); w.Close(); fs.Close(); fs=new FileStream(FILE_NAME, FileMode.Open,FileAccess.Read); BinaryReader r = new BinaryReader(fs); for (int i=0; i<11; i++) Console.WriteLine(r.ReadInt32()); r.Close(); fs.Close(); }

Стандартные диалоговые окна

Создадим оконное приложение, позволяющее объединять содержимое двух выбранных пользователем файлов и сохранять их в третьем.

Интерфейс программы очень прост: всего три кнопки в окне. Чтобы обеспечить правильную последовательность действий пользователя, будем управлять доступностью кнопок.

public partial class Form1: Form

{ public Form1()

{ InitializeComponent();

 ofdSourceFile.InitialDirectory = "c:\\";

ofdSourceFile.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

}

private void Form1_Load(object sender, EventArgs e)

{ btnSrcFile1.Enabled = true;

btnSrcFile2.Enabled = false;

btnSaveFile.Enabled = false;

}

private void btnSrcFile1_Click(object sender, EventArgs e)

{ btnSrcFile1.Enabled = false;

OpenAndReadFile();

btnSrcFile2.Enabled = true;

}

private void btnSrcFile2_Click(object sender, EventArgs e)

{ btnSrcFile2.Enabled = false;

OpenAndReadFile();

btnSaveFile.Enabled = true;

}

private void OpenAndReadFile()

{ StreamReader sr;

if (ofdSourceFile.ShowDialog() == DialogResult.OK)

{ if (ofdSourceFile.ShowDialog() == DialogResult.OK)

{ sr = new StreamReader(ofdSourceFile.FileName);

   // сюда можно вставить код для чтения из файла

   sr.Close();

}

}

}

private void btnSaveFile_Click(object sender, EventArgs e)

{ btnSaveFile.Enabled = false;

StreamWriter sw;

if (sfdSaveFile.ShowDialog() == DialogResult.OK)

{ sw = new StreamWriter(sfdSaveFile.FileName);

// сюда можно вставить код для записи в файл

sw.Close();

}

}

}

Здесь используется переменная ofdSourceFile, которая описана как OpenFileDialog. Это описание генерируется дизайнером в ответ на перетаскивание на форму соответствующего элемента управления. Часто целесообразнее описать такую переменную как локальную в рамках метода-обработчика.

Обратите внимание на то, что текст приложения еще не завершен – необходимо реализовать чтение из двух файлов и запись их содержимого в третий файл.

Сериализация

Использование ранее рассмотренных простых средств файлового ввода-вывода оказывается совершенно неудобным для постоянного хранения сложных объектов с разнообразной и даже динамически меняющейся структурой. Для подобных случаев предлагается использовать поддерживаемый в.NET механизм сериализации. Буквальный перевод этого термина означает преобразование информационных объектов в линейную хранимую форму и обратную реконструкцию линейного представления в объектную структуру.

Пространства имен

System.Runtime.Serialization.Formatters.Binary;

Синтаксическая форма сериализации выглядит довольно просто:

[Serializable] public class Radio

{ public bool Autosearch;

public double[] stations;

[NonSerialized]

public string radioed = “XF-552RR6”;

}

Остальные классы нашего примера:

[Serializable] public class Car

{ public Radio theRadio=new Radio();

public bool Is4Wheel;

}

[Serializable] public class JamesBondCar: Car

{ public bool canFly;

public bool canShoot;

}

public class Program

{ static void Main()

{ JamesBondCar jbc = new JamesBondCar();

jbc.canFly = false;

jbc.canShoot = true;

jbc.theRadio.stations = new double[]{88.8, 99.9, 103.7};

jbc.Is4Wheel=true;

// Теперь сохраним объект в файле user. dat.

BinaryFormatter binFormat = new BinaryFormatter();

Stream fStream = new FileStream(“user.dat",

FileMode.Create, FileAccess.Write, FileShare.None);

binFormat. Serialize (fStream, jbc);

fStream.Close();

}

}

В приведенном примере сериализация осуществлялась в компактном бинарном формате с помощью класса BinaryFormatter. Часто практичнее сохранят в формате XML  с помощью другого класса-«форматизатора» SoapFormatter.

Такая простота использования сериализации может вызвать недооценку сложности того, что происходит за кулисами. Ведь сериализуемый объект может быть производным классом и содержать внутренние достаточно сложные переменные-объекты и, даже, коллекции объектов. В этом случае процесс сериализации должен быть выполнен на всех уровнях, либо, если этого не требуется, быть настолько управляемым, чтобы регулировать глубину сериализации.

Объектные графы

Для лучшего представления о том, как выполняется процесс сериализации, удобно использовать так называемые объектные графы. Представим, что имеются следующие классы. «Автомобиль», «Радио» (класс «Автомобиль» содержит переменную этого типа) и «Автомобиль Джеймса Бонда» (производный от «Автомобиль»).

Текстовое представление этого графа (которое строит CLR) выглядит так:

[Computer 3, ref 2], [CPU 2], [Notebook 1, ref 3, ref 2]

Таким образом, на графе присутствуют отношения двух типов – наследование и композиция. При сериализации объекта класса Notebook объектный граф поможет учесть все его связи, в том числе завуалированную связь с объектом CPU.

Если Вам не нужно осуществлять сериализацию всех переменных объекта (выборочная сериализация), пометьте несериализуемые переменные атрибутом [NonSerialized].

Замечания.

1. Атрибут [Serializable] не наследуется. (в Справке сказано, что класс с этим атрибутом cannot be inherited!)

2. Сериализация с помощью BinaryFormatter сохраняет все переменные объекта. Сериализация с помощью SoapFormatter или XmlSerializer сохраняет только открытые переменные и закрытые переменные, доступные через открытые свойства (а как это?).

Десериализация vs Singleton

Формат сериализации

- BinaryFormatter – компактный двоичный формат. Требует подключения System.Runtime.Serialization.Formatters.Binary.

- SoapFormatter – в виде сообщения SOAP. Требует подключения System.Runtime.Serialization.Formatters.Soap. В проект нужно добавить ссылку на System.Runtime.Serialization.Formatters.Soap.dll. Этот вариант удобен при передаче данных по протоколу HTTP.

- XmlSerializer – в виде «чистого» XML. Требует подключения System.Xml.Serialization.

Объекты всех этих типов для осуществления сериализации реализуют методы Serialize и Deserialize.

Реконструкция объектов

// Чтение JamesBondCar из двоичного файла.

fStream = File.OpenRead("CarData");

JamesBondCar carFromDisk =

(JamesBondCar)binFormat. Deserialize (fStream);

Console.WriteLine("Может ли машина летать? {0}",

carFromDisk.canFly);

fStream.Close();

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 28; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.201.209 (0.022 с.)