Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота_6.doc
Скачиваний:
5
Добавлен:
16.11.2019
Размер:
303.62 Кб
Скачать

6.2. Простір імен System.Io. Введення/виведення в c#.

Для операцій введення-виведення служить простір імен System.IO.

Короткий огляд найбільш важливих класів і перерахувань із цього простору імен:

- BinaryReader – дозволяє читати з файлу дані різних типів (цілі, дійсні, логічні й т.п.)

- BinaryWriter – дозволяє записувати у файл дані різних типів (цілі, дійсні, логічні й т.п.)

- Directory – клас зі статичними методами для роботи з папками

- DirectoryInfo – клас для роботи з деякою папкою

- File – клас зі статичними методами для роботи з файлом

- FileInfo – клас для роботи з деяким файлом

- Path – клас для роботи з файловими шляхами

- Перерахування FileAttributes – атрибути файлу

- Перерахування FileMode – можливі способи відкриття файлу

- Перерахування FileAccess містить константи, що показують, чи відкритий файл для читання, запису тощо.

- FileSystemWatcher – клас для відстеження змін у файловій системі

- Перерахування NotifyFilters – параметри, за якими відбувається відстеження змін у файловій системі

- Перерахування WatcherChangeTypes – які зміни відслідковуються у файловій системі

6.3. Класи для роботи з папками і файлами

Для роботи з файлами і папками в просторі імен System.IO існують наступні класи:

Directory – містить ряд статичних методів для виконання різних операцій з папками (створення, видалення, перевірка існування, одержання поточної папки й т.п.).

DirectoryInfo – аналогічний класу Directory, тільки його методи не статичні – для використання цього класу треба створити його екземпляр (параметром для конструктора служить ім'я папки).

File – містить ряд статичних методів для виконання різних операцій з файлами (створення, видалення, копіювання, запис і зчитування з файлу й т.п.).

FileInfo – аналогічний класу File, тільки його методи не статичні – для використання цього класу треба створити його екземпляр (параметром для конструктора служить ім'я файлу).

Класи Directory та File є безпосередніми нащадками класу Object, а класи DirectoryInfo та FileInfo – нащадками абстрактного класу FileSystemInfo.

Клас Directory

Клас Directory призначений для роботи з папками. Цей клас містить статичні методи для роботи з папками (на відміну від класу DirectoryInfo, що містить аналогічні методи, застосовувані для екземпляра класу). Основні методи класу Directory:

- CreateDirectory – створює папку із зазначеним ім'ям.

- Exists – перевіряє існування папки із зазначеним ім'ям.

- Delete – видаляє папку із зазначеним ім'ям.

- Move – переміщає або перейменовує папку із зазначеним ім'ям.

Приклад:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

Directory.CreateDirectory("D:\\temp"); //Створення папки

if (Directory.Exists("D:\\temp1")) //Перевірка існування папки

{

Console.WriteLine("Папка \"temp1\" існує");

}

else

{

Console.WriteLine("Папка \"temp1\" не існує");

}

if (Directory.Exists("D:\\temp"))

{

Console.WriteLine("Папка \"temp\" існує");

}

else

{

Console.WriteLine("Папка \"temp\" не існує");

}

Directory.Move("D:\\temp", "D:\\temp2"); //Переміщення папки

Directory.Delete("D:\\temp2"); //Видалення папки

}

}

}

Метод Move можна використовувати не тільки для переміщення, але й для перейменування папки. Для цього папка, що задається першим параметром (тобто та, котру переміщаємо) повинна знаходитися на тому ж рівні, що й папка, яка задається другим параметром (тобто куди переміщаємо).

Клас File

Клас File призначений для роботи з файлами. Він містить статичні методи, які дозволяють створювати, видаляти, перейменовувати і робити інші дії з файлами. Для цього класу існує парний клас FileInfo, що містить аналогічні методи екземпляра класу.

Основні методи класу File:

- Create – створення файлу.

- Exists – перевірка існування файлу.

- Delete – видалення файлу.

- Move – перейменування й переміщення файлу.

- Copy – копіювання файлу.

Приклад, що демонструє застосування цих методів:

File.Create("d:\\a.txt"); // Створення файлів

File.Create("d:\\1.txt");

if (File.Exists("d:\\1.txt")) // Перевірка існування файлу

{

File.Delete("C:\\1.txt"); // Видалення файлу

}

File.Move("d:\\a.txt", "d:\\b.txt");

// Перейменування файлу a.txt в b.txt

File.Move("d:\\a.txt", "D:\\c.txt"); // Переміщення файлу

File.Copy("D:\\c.txt", "D:\\x.txt"); // Копіювання файлу

І для переміщення, і для перейменування файлу використано той самий статичний метод Move (по суті, це та сама операція).

Приклад, що демонструє використання методів класу для створення, запису і зчитування даних з текстових файлів:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace File1

{

class Program

{

static void Main(string[] args)

{

string path = @"MyTest.txt";

string path1 = @"Val.txt";

string Text = "Привіт1";

int x;

//Створення файлу для запису. Якщо файл існує - дані //перезаписуються

File.WriteAllText(path, Text); //Додавання даних у файл

File.AppendAllText(path, "\nПривіт2");

string appendText = "\nДобавлений текст1";

//Додавання даних у файл

File.AppendAllText(path, appendText);

// Зчитування даних з файлу 2-а методами

string readText = File.ReadAllText(path);

string[] readText1 = File.ReadAllLines(path);

Console.WriteLine("Текст із файла (ReadAllText):");

Console.WriteLine(readText);

Console.WriteLine("Текст із файла (ReadAllLines):");

foreach (string i in readText1)

{

Console.WriteLine(i);

}

//Створення файлу з використанням класу потоків FileStream

FileStream fp = File.Create(path1);

//Закриття потоку fp, інакше доступ до файлу буде закритий

fp.Close();

//Генерація і запис у файл випадкових чисел

Random val = new Random(); // val - об'єкт класу Random

for (int j = 0; j < 10; j++)

{

//Next - метод генерує випадкові числа з діапазону 1-100

x = val.Next(1, 100);

File.AppendAllText(path1, x.ToString() + "\n"); //Запис у файл

}

//Порядкове зчитування даних з файлу в масив

string[] readVal = File.ReadAllLines(path1);

foreach (string i in readVal)

{

Console.WriteLine(i);

x = Int16.Parse(i);

x = x * 2;

Console.WriteLine(x);

}

}

}

}

Клас FileSystemInfo

Клас FileSystemInfo є предком для класів DirectoryInfo і FileInfo.

Клас FileSystemInfo містить ряд властивостей, які дозволяють одержати загальні характеристики файлу або папки – наприклад, час створення, різні атрибути (тільки для читання, схований і т.п.).

Найбільш важливі методи і властивості цього класу (усі властивості і методи застосовні як до файлів, так і до папок):

- Delete – метод для видалення.

- Refresh – метод для оновлення інформації про файл або папку (викликається, наприклад, перед одержанням атрибутів).

- CreationTime – читає або задає час створення.

- LastAccessTime – читає або задає час останнього доступу.

- LastWriteTime – читає або задає час останнього запису.

- Attributes – читає або задає атрибути (схований, архівний, системний, тимчасовий, тільки для читання й ін.). Один з атрибутів (а саме Directory) дозволяє з'ясувати, чи не є об'єкт папкою.

- FullName – читає повне ім'я (диск, папки, підпапки й т.д.).

- Name – ім'я файлу або папки.

- Extension – розширення.

- Exists – існування файлу або папки.

Клас DirectoryInfo

Клас DirectoryInfo призначений для роботи з папками. Він дозволяє робити стандартні операції – переміщення, видалення, створення папок і підпапок й ін.. Крім того, методи цього класу дозволяють одержати всі підкаталоги і файли зазначеної папки. На відміну від класу Directory, методи класу DirectoryInfo – це методи екземпляра (тобто вони не статичні).

Приклад використання класу:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

DirectoryInfo di = new DirectoryInfo("d:\\tmp\\tmp2");

// Створення об'єкта

di.Create(); // Створення папки

String s = ""; // Виведення інформації про папку

s += "Full nane: " + di.FullName + "\n";

s += "Root: " + di.Root + "\n";

s += "Name: " + di.Name;

Console.WriteLine(s);

di.MoveTo("d:\\tmp\\tmp3"); // Переміщення папки

di.CreateSubdirectory("subdir1"); // Створення підпапок

di.CreateSubdirectory("subdir2");

DirectoryInfo[] ds = di.GetDirectories();

// Одержання імен всіх підпапок

foreach (DirectoryInfo d in ds)

{

Console.WriteLine(s);

}

di.Delete(true); // Видалення папки і всіх підпапок.

}

}

}

Окремого методу для перейменування немає – використовується метод MoveTo, як параметр якого вказується нове ім'я.

В методі Delete для видалення разом з папкою всіх її підпапок потрібно вказати параметр true. Якщо ж вказати параметр false або нічого не вказати, то виникне відповідне виключення.

Перерахування FileAttributes

За допомогою перерахування FileAttributes задаються атрибути для файлів і папок. Найбільш часто використовуються такі значення цього перерахування:

Directory – визначає, чи не є об'єкт папкою.

Hidden – визначає, чи не є об'єкт (папка або файл) схованим.

ReadOnly – визначає, чи не має файл атрибут "тільки для читання".

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

System – визначає, чи не є файл системним.

Archive – визначає, чи не є файл архівним.

Compressed – визначає, чи не є файл стислим файлом.

Приклад використання:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

DirectoryInfo di = new DirectoryInfo("d:\\tmp\\tmp2");

// Створення об'єкта

di.Create(); // Створення папки

String s = ""; // Вивід інформації про папку

s += "Full nane: " + di.FullName + "\n";

s += "Root: " + di.Root + "\n";

s += "Name: " + di.Name;

Console.WriteLine(s);

di.MoveTo("d:\\tmp\\tmp3"); // Переміщення папки

di.CreateSubdirectory("subdir1"); // Створення підпапок

di.CreateSubdirectory("subdir2");

DirectoryInfo[] ds = di.GetDirectories();

// Одержання імен всіх підпапок

foreach (DirectoryInfo d in ds)

{

Console.WriteLine(s);

}

di.Attributes |= FileAttributes.Hidden;

// Привласнення атрибута "Тільки для читання"

FileAttributes fi = di.Attributes;

// Одержання атрибутів файлу

// Визначення, є чи в папки атрибут Hidden

if ((fi & FileAttributes.Hidden) == FileAttributes.Hidden)

{

Console.WriteLine("Hidden");

}

// Визначення, є чи в папки атрибут ReadOnly

if ((fi & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)

{

Console.WriteLine("ReadOnly");

}

}

}

}

Зверніть увагу на те, як визначається наявність деякого атрибута:

if((fi & FileAttributes.Hidden) == FileAttributes.Hidden)...

Якщо написати:

if(fi == FileAttributes.Hidden) // Логічний помилка!

то фрагмент програми видасть правильний результат тільки тоді, коли атрибут Hidden буде в папки єдиним. Зазвичай атрибутів декілька, тому потрібно використовувати перший варіант.

Клас FileInfo

Можна вважати, що клас FileInfo являє собою файл, що міститься на жорсткому диску. За допомогою цього класу можна проводити стандартні операції з файлом – перейменування, переміщення, видалення, створення й ін. Крім того, можна одержати значення характеристик файлу (час останнього доступу, розмір й ін.), а також атрибути файлу (схований, системний й ін.).

Приклад роботи із класом:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

FileInfo fi = new FileInfo(@"d:\tmp\1.txt");

// Читання інформації про файл

// Виведення інформації про файл

Console.WriteLine(fi.FullName); // Повне ім'я

Console.WriteLine(fi.Name); // Тільки ім'я файлу

String fullPath = fi.DirectoryName;

// Повний шлях без імені файлу

Console.WriteLine(fullPath);

// Перейменування файлу (шляхом переміщення у цю ж папку під //іншим ім'ям.)

fi.MoveTo(fullPath + @"\qqq.txt");

fi = new FileInfo(@"d:\tmp\2.txt");

// Створення нового файлу

FileStream fs = fi.Create();

fs.Close(); // Закриття потоку, пов'язаного з файлом

Console.WriteLine("Creation {0}", fi.CreationTime);

// Виведення часу створення

if (fi.Exists) // Перевірка, чи існує файл

{

fi.Delete(); // Видалення файлу

}

}

}

}

У прикладі використано рядок fs.Close();. Якщо його не додати, то декількома рядками нижче не можна буде видалити файл, оскільки з файлом в результаті виклику методу Create зв'язується файловий потік, і файл вважається використовуваним додатком. Для звільнення файлу потрібно закрити цей файловий потік.

Клас Path

Клас Path призначений для роботи з файловими шляхами. Цей клас володіє рядом методів, які розглянемо на прикладі:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

// Одержання використовуваного в операційній системі роздільника //для шляхів

char ch = Path.DirectorySeparatorChar;

Console.WriteLine(ch);

// Одержання всіх заборонених в імені шляху символів

char[] chs = Path.InvalidPathChars;

foreach (char c in chs)

{

Console.Write(c + " ");

}

Console.WriteLine();

// Робота зі шляхами

string s = Path.ChangeExtension(@"d:\tmp.txt", "ini");

// Зміна розширення файлу

Console.WriteLine(s);

s = Path.GetFileName(@"d:\tmp.txt");

// Одержання імені файлу

Console.WriteLine(s);

// Одержання розширення файлу (разом із крапкою)

s = Path.GetExtension(@"d:\tmp.txt");

Console.WriteLine(s);

// Одержання імені файлу без розширення

s = Path.GetFileNameWithoutExtension(@"d:\tmp.txt");

Console.WriteLine(s);

//Одержання повного імені файлу за відносним

s = Directory.GetCurrentDirectory();

Console.WriteLine(s);

s = Path.GetFullPath(@"..\..\tmp.txt");

Console.WriteLine(s);

// Одержання імені тимчасового файлу (разом зі шляхом)

s = Path.GetTempFileName();

Console.WriteLine(s);

// Одержання шляху до папки для тимчасових файлів

s = Path.GetTempPath();

Console.WriteLine(s);

}

}

}

Результати роботи приклада представлені на рис.6.3.

Рис.6.3 - Результати роботи приклада програми

Клас Path при роботі зі шляхами не вимагає, щоб такий шлях дійсно існував. Наприклад, у прикладі не мається на увазі, що файл в:\tmp.txt існує. Це, зокрема, означає, що метод ChangeExtension у реальності не міняє розширення файлу – він просто створює рядок з іншим розширенням, який потрібно використати для реального перейменування (наприклад, через статичний метод Move класу File).

Клас FileSystemWatcher

Клас FileSystemWatcher із простору імен System.IO призначений для відстеження змін у файловій системі. Зміни можна відслідковувати як на локальному комп'ютері, так і на віддаленому.

Приклад використання класу.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

// Будемо стежити за папкою "d:\tmp"

FileSystemWatcher watcher = new FileSystemWatcher(@"d:\tmp");

// Стежимо за зміною імені файлів

watcher.NotifyFilter = NotifyFilters.FileName;

// Додаємо оброблювач для події перейменування файлу

watcher.Renamed += new RenamedEventHandler(OnRenamed);

// Починаємо спостереження

watcher.EnableRaisingEvents = true;

// Стежимо, поки користувач не нажав q

Console.WriteLine("Press 'q' to exit");

while (Console.Read() != 'q') ;

}

// Оброблювач для події перейменування файлу.

private static void OnRenamed(object source, RenamedEventArgs e)

{

Console.WriteLine("{0} renamed to {1}", e.OldName, e.Name);

}

}

}

Послідовність дій наступна – спочатку вказуємо, за чим хочемо стежити (за якою папкою, за якими файлами та за якими подіями для цих файлів). Потім вказуємо, що за метод буде виконуватися при настанні тієї або іншої події. Зрозуміло, цей метод повинен бути в програмі. У прикладі відслідковується перейменування для всіх файлів у папці "d:\tmp".

Перерахування NotifyFilters

Перерахування NotifyFilters служить для завдання параметрів, за якими відбувається відстеження змін у файловій системі. Воно може приймати наступні значення:

- Size – зміна розміру файлу або папки

- CreationTime – зміна часу створення файлу або папки

- FileName – зміна імені файлу

- DirectoryName – зміна імені папки

- Attributes – зміна атрибутів файлу або папки

- LastAccess – зміна часу останнього доступу до файлу або папки

- LastWrite – зміна часу останнього запису у файл або папку

- Security – зміна в установках безпеки файлу або папки

Приклад використання:

FileSystemWatcher w = new FileSystemWatcher();

//Зміни в розмірі або в імені файлу

w.NotifyFilter = NotifyFilters.Size | NotifyFilters.FileName;

Перерахування WatcherChangeTypes

WatcherChangeTypes призначено для визначення, які зміни відслідковуються у файловій системі. Значення які може приймати перерахування:

- Changed – відслідковувати зміни в атрибутах файлу або папки (наприклад, розмір, час останнього запису й ін.)

- Created – створення файлу або папки

- Deleted – видалення файлу або папки

- Renamed – перейменування файлу або папки

- All – усе з перерахованого

Клас FileSystemWatcher

Приклад використання класу FileSystemWatcher. У даному прикладі відслідковують події перейменування, видалення, створення і зміни розміру файлу.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

FileSystemWatcher watcher = new FileSystemWatcher(@"d:\tmp");

// Стежимо за зміною імені та розміру файлів

watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;

// Додаємо оброблювачі для подій

watcher.Renamed += new RenamedEventHandler(OnRenamed);

watcher.Deleted += new FileSystemEventHandler(OnChanged);

watcher.Created += new FileSystemEventHandler(OnChanged);

watcher.Changed += new FileSystemEventHandler(OnChanged);

watcher.EnableRaisingEvents = true;

Console.WriteLine("Press 'q' to exit");

while (Console.Read() != 'q') ;

}

// Оброблювач для події перейменування файлу

private static void OnRenamed(object source, RenamedEventArgs e)

{

Console.WriteLine("{0} renamed to {1}", e.OldName, e.Name);

}

// Оброблювач для інші події файлу

private static void OnChanged(object source, FileSystemEventArgs e)

{

switch (e.ChangeType)

{

case WatcherChangeTypes.Deleted:

Console.WriteLine("{0} - deleted", e.Name);

break;

case WatcherChangeTypes.Created:

Console.WriteLine("{0} - created", e.Name);

break;

case WatcherChangeTypes.Changed:

Console.WriteLine("{0} - changed", e.Name);

break;

}

}

}

}

Для оброблювача події Changed встановлений фільтр:

watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;

Тобто, наприклад, не відслідковуємо в даному прикладі час останнього доступу до файлу, або зміни атрибутів файлу.

Також використовується один оброблювач для 3-х подій – Deleted, Created й Changed.

Рис.6.4 - Результати роботи програми

Клас Convert

Клас Convert служить для конвертації різних типів один в одний. Наприклад, можна конвертувати рядкове подання числа або булеве значення в саме число, або булеве значення:

string s = "1234";

int a = Convert.ToInt32(s);

bool b = Convert.ToBoolean("true");

У змінні a й b запишуться число 1234 і значення true відповідно.

Часто форматування деякого об'єкта залежить від регіональних настроювань. Наприклад, у США в датах пишуть спочатку місяць, а потім число, а в Україні – навпаки. У такому випадку використовується метод ChangeType класу Convert, що приймає в якості одного з параметрів форматтер для конкретного регіону (культури).

Приклад:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace temp11

{

class Program

{

static void Main(string[] args)

{

IFormatProvider formatRu = new System.Globalization.CultureInfo("ru-RU", true);

IFormatProvider formatUS = new System.Globalization.CultureInfo("en-US", true);

DateTime f = (DateTime)Convert.ChangeType("10/11/2008", typeof(DateTime), formatRu);

Console.WriteLine("Формат України - " + f);

f = (DateTime)Convert.ChangeType("10/11/2008", typeof(DateTime), formatUS);

Console.WriteLine("Формат USA - " + f);

}

}

}

Після першого виклику в змінну f запишеться 11 грудня, а після другого – 12 листопада.

Рис.6.5 - Результати роботи програми