// Для условной компиляции используются символы. // Определение символа дается директивой #define // Отказ от определения - директива #undef // Директивы помещаются в начало файла // В тексте при этом можно использовать условные операторы #if, #else, #endif #define stream //#undef stream using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Xml; using System.Data; namespace nsWriteReadFiles { // Пример работы с файлами class prWriteReadFiles { static void Main(string[] args) { // Описывается и создается в памяти объект rnd типа Random // Объект rnd позволяет генерировать последовательность //случайных чисел Random rnd = new Random(); // Описывается переменная типа Double Double d; // Переменной типа double присваивается случайное значение в //интервале 0;1 d = rnd.NextDouble(); Console.WriteLine("Генератор вернул случайное число d = {0} из интервала [0;1)", d); // Работа с бинарным файлом // Запись в бинарный файл Console.WriteLine("Запись в бинарный файл числа с плавающей запятой"); #if stream // Описывается массив байтов, который будет //хранить бинарное представление информации, // помещаемой в поток. В данном случае это будет //массив из 8 байтов, содержащий число d byte[] bytes; // В массив bytes помещаются байты, //из которых состоит переменная d bytes = BitConverter.GetBytes(d); // Описывается и создается в памяти объект s типа Stream, // которому передается ссылка на содержимое вновь //созданного файла с именем Test, // находящегося в текущей директории - там, //где находится exe-файл процесса using (Stream s = File.Create("Test")) { // В файл записывается массив с бинарным содержимым // переменной типа double s.Write(bytes, 0, bytes.Length); // Объект s (поток) и файл освобождаются } #else // Альернативный вариант // Использование класса BinaryWriter // Нет необходимости в массиве байтов и в преобразовании using (BinaryWriter bw = new BinaryWriter(File.Create("Test"))) bw.Write(d); #endif Console.WriteLine("Значение переменной d = {0} записано в бинарный файл Test", d); Console.ReadLine(); // Считывание из бинарного файла #if stream // 1-ая версия. Используется массив байтов и класс Stream // Массив байтов инициализируется для "чистоты эксперимента" bytes.Initialize(); //bytes = new byte[sizeof(Double)]; // Создается объект s типа Stream со ссылкой на файл, // содержимое которого будет помещаться в поток using (Stream s = File.OpenRead("Test")) { // В массив bytes считывается содержимое файла s.Read(bytes, 0, bytes.Length); // Файл и объект s освобождаются } // На консоль выводится содержимое массива в формате //переменной типа double Console.WriteLine("Число, считанное с бинарного файла с помощью Stream ={0}", BitConverter.ToDouble(bytes, 0)); #else // 2-ая версия - использование класса BinaryReader using (BinaryReader br = new BinaryReader(File.OpenRead("Test"))) Console.WriteLine("Число, считанное с бинарного файла с помощью BinaryReader ={0}", br.ReadDouble()); #endif Console.ReadLine(); // Запись в текстовой файл Console.WriteLine("Запись в текстовой файл числа с плавающей запятой"); // Создается объект tw типа TextWriter, // которому ставится в соответствие файл для записи текста using (TextWriter tw = File.CreateText("Test.txt")) // В файл записывается число типа double и сносится строка tw.WriteLine(d); // Файл и объект tw освобождаются Console.WriteLine("Значение переменной d = {0} записано в текстовой файл Test.txt", d); Console.ReadLine(); // Чтение из текстового файла // Описывается строка str, в которую будет помещено //содержимое текстового файла string str; // Создается объект tr типа TextReader и открывается //текстовой файл, using (TextReader tr = File.OpenText("Test.txt")) { // В строку str считывается строка текста из потока sr str = tr.ReadLine(); // Файл и объект sr освобождаются } // Строка str выводится на консоль Console.WriteLine("Содержимое текстового файла равно " + str); Console.ReadLine(); //Запись в xml-формате Console.WriteLine("Запись в xml-файл числа с плавающей запятой"); // Создается объект xmlw типа XmlWriter и xml-файл using (XmlWriter xmlw = XmlWriter.Create("Test.xml")) { // Записывается узел типа элемент с именем aDouble xmlw.WriteStartElement("aDouble"); // Записывается содержание узла aDouble xmlw.WriteValue(d); // файл и объект xmlw освобождаются } Console.WriteLine( "Значение переменной d = {0} записано в файл формата Test.xml в узел с именем aDouble", d); Console.ReadLine(); // Чтение из xml-файла // Создается объект xmlr типа XmlReader, соответствующий xml-файлу using (XmlReader xmlr = XmlReader.Create("Test.xml")) { // Считываются все узлы до конца файла while (xmlr.Read()) if (xmlr.NodeType == XmlNodeType.Text) // Если узел текстовой // Содержимое узла распечатывается на консоли Console.WriteLine("Значение переменной d, считанное с файла Test.xml, равно {0}", xmlr.Value); // файл и объект xmlr освобождаются } Console.ReadLine(); // Запись в xml-файл кэшированных данных Console.WriteLine("Запись в xml-файл кэшированной базы данных"); // Создается объект ds типа DataSet, кэширующий данные в //памяти, с именем aDataSet using (DataSet ds = new DataSet("aDataSet")) { // К объекту ds добавляется таблица с именем aTable ds.Tables.Add(new DataTable("aTable")); // К таблице добавляется колонка с именем aColumn ds.Tables["aTable"].Columns.Add(new DataColumn("aColumn")); // К таблице добавляется строка ds.Tables[0].Rows.Add(ds.Tables[0].NewRow()); // В элемент 0,0 таблицы заносится число d ds.Tables[0].Rows[0][0] = d; // Данные объекта ds записываются во вновь создаваемый xml-файл ds.WriteXml("Test.ds.xml");//Console.Out // файл и объект ds освобождаются } Console.WriteLine( "Значение переменной d = {0} записано в файл Test.ds.xml как элемент [0,aColumn] таблицы aTable базы aDataSet", d); Console.ReadLine(); // Считывание xml-файла в память // Создается объект ds класса DataSet без имени using (DataSet ds = new DataSet()) { // В объект считывается информация из xml-файла ds.ReadXml("Test.ds.xml"); // Содержимое 0,0-элемента таблицы aTable выводится на консоль Console.WriteLine( "Значение элемента [0;aColumn] таблицы aTable из базы данных, считанной с файла Test.ds.xml, равно {0}", ds.Tables["aTable"].Rows[0]["aColumn"]); // файл и объект ds освобождаются } Console.ReadLine(); } } }