понедельник, 12 марта 2018 г.

Робота з файловою системою

Работа з файлової системою: класи Directory і Filе і класи DirectoryInfo і FileInfo

Робота з файловою системою

У просторі імен System.IO передбачено чотири класи, які призначені для роботи з файловою системою комп'ютера, тобто для створення, видалення перенесення і т.д. файлів і каталогів.
Перші два типи - Directory і Fi1е реалізують свої можливості за допомогою статичних методів, тому дані класи можна використовувати без створення відповідних об'єктів (екземплярів класів).
Наступні типи - DirectoryInfo і FileInfo мають схожі функціональними можливостями c Directory і Fi1е , але породжені від класу FileSystemInfo і тому реалізуються шляхом створення відповідних примірників класів.
Зауваження . Перед вивченням даної лекції скопіюйте на диск d свого комп'ютера архів prim . Уважно вивчіть вміст даного архіву.

Робота з каталогами

Абстрактний клас FileSystemInfo
Значна частина членів FileSystemInfo призначена для роботи з загальними характеристиками файлу або каталогу (мітками часу, атрибутами і т. П.). Розглянемо деякі властивості FileSystemInfo :

властивістьопис
AttributesДозволяє отримати або встановити атрибути для даного об'єкта файлової системи. Для цього властивості використовуються значення і перерахування FileAttributes
CreationTimeДозволяє отримати або встановити час створення об'єкта файлової системи
ExistsМоже бути використано для того, щоб визначити, чи існує даний об'єкт файлової системи
ExtensionДозволяє отримати розширення для файлу
FullNameПовертає ім'я файлу або каталогу з зазначенням шляху до нього в файлової системі
LastAccessTimeДозволяє отримати або встановити час останнього звернення до об'єкта файлової системи
LastWriteTimeДозволяє отримати або встановити час останнього внесення змін до об'єкта файлової системи
NameПовертає ім'я зазначеного файлу. Це властивість доступно тільки для читання. Для каталогів повертає ім'я останнього каталогу в ієрархії, якщо це можливо. Якщо немає, повертає повністю певне ім'я
У FileSystemInfo передбачено і кілька методів. Наприклад, метод Delete () - дозволяє видалити об'єкт файлової системи з жорсткого диска, a Refresh () - оновити інформацію про об'єкт файлової системи.
клас DirectoryInfo
Даний клас успадковує члени класу FileSystemInfo і містить додатковий набір членів, які призначені для створення, переміщення, видалення, отримання інформації про каталогах і підкаталогах в файлової системі. Найбільш важливі члени класу містяться в наступній таблиці:

членопис
Create () CreateSubDirectory ()Створюють каталог (або підкаталог) за вказаною шляху в файлової системі
Delete ()Видаляє порожній каталог
GetDirectories ()Дозволяє отримати доступ до підкаталогам поточного каталогу (у вигляді масиву об'єктівDirectoryInfo )
GetFiles ()Дозволяє отримати доступ до файлів поточного каталогу (у вигляді масиву об'єктів FileInfo )
MoveTo ()Переміщує каталог і весь його вміст на нову адресу в файлової системі
Parentповертає батьківський каталог в ієрархії файлової системи
Робота з типом DirectoryInfo починається з того, що ми створюємо екземпляр класу (об'єкт), вказуючи при виклику конструктора в якості параметра шлях до потрібного каталогу. Якщо ми хочемо звернутися до поточного каталогу (тобто каталогу, в якому в даний час проводиться виконання програми), замість параметра використовується позначення "." наприклад:
// Створюємо об'єкт DirectoryInfo, якому буде звертатися до поточного каталогу
DirectoryInfo dir1 = new DirectoryInfo ( ".");
// Створюємо об'єкт DirectoryInfo, якому буде звертатися до каталогу d: \ prim
DirectoryInfo dir2 = new DirectoryInfo (@ "d: \ prim");
Якщо ми спробуємо створити об'єкт DirectoryInfo , зв'язавши його з неіснуючим каталогом, то буде згенеровано виняток System.IO.DirectoryNotFoundException . Якщо ж все нормально, то ми зможемо отримати доступ до даного каталогу. У прикладі, який наведений нижче, ми створюємо об'єкт DlrectoryInfo , який пов'язаний з каталогом d: \ prim , і виводимо інформацію про даний каталозі:
using System;
using System.Text;
using System.IO;

namespace MyProgram
{
 class Program
 {
  static void Main (string [] args)
  {
    DirectoryInfo dir = new DirectoryInfo (@ "d: \ prim");
    Console.WriteLine ( "*****" + dir.Name + "*****");
    Console.WriteLine ( "FullName: {0}", dir.FullName);
    Console.WriteLine ( "Name: {0}", dir.Name);
    Console.WriteLine ( "Parent: {0}", dir.Parent);
    Console.WriteLine ( "Creation: {0}", dir.CreationTime);
    Console.WriteLine ( "Attributes: {0}", dir.Attributes.ToString ());
    Console.WriteLine ( "Root: {0}", dir.Root);
   }
 }
}
Властивість Attributes дозволяє отримати інформацію про атрибути об'єкта файлової системи. Можливі значення даного властивості приведені в наступній таблиці:

значенняопис
ArchiveЦей атрибут використовується додатками при проведенні резервного копіювання, а в деяких випадках - видалення старих файлів
CompressedВизначає, що файл є стислим
DirectoryВизначає, що об'єкт файлової системи є каталогом
EncryptedВизначає, що файл є зашифрованим
HiddenВизначає, що файл є прихованим (такий файл не буде виводитися при звичайному перегляді каталогу)
NormalВизначає, що файл знаходиться в звичайному стані і для нього встановлені будь-які інші атрибути. Цей атрибут не може використовуватися з іншими атрибутами
OfflineФайл (розташований на сервері) кешуватися в сховище off-line на клієнтському комп'ютері. Можливо, що дані цього файлу вже застаріли
ReadonlyФайл доступний тільки для читання
SystemФайл є системним (тобто файл є частиною операційної системи або використовується виключно операційною системою)
Через DirectoryInfo можна не тільки отримувати доступ до інформації про поточний каталозі, але отримати доступ до інформації про його підкаталогах:
class Program
{
 static void printDirect (DirectoryInfo dir)
 {
  Console.WriteLine ( "*****" + dir.Name + "*****");
  Console.WriteLine ( "FullName: {0}", dir.FullName);
  Console.WriteLine ( "Name: {0}", dir.Name);
  Console.WriteLine ( "Parent: {0}", dir.Parent);
  Console.WriteLine ( "Creation: {0}", dir.CreationTime);
  Console.WriteLine ( "Attributes: {0}", dir.Attributes.ToString ());
  Console.WriteLine ( "Root: {0}", dir.Root);
 }

 static void Main (string [] args)
 {
  DirectoryInfo dir = new DirectoryInfo (@ "d: \ prim");
  printDirect (dir);
  DirectoryInfo [] subDirects = dir.GetDirectories ();
  Console.WriteLine ( "Знайдено {0} підкаталогів", subDirects.Length);
  foreach (DirectoryInfo d in subDirects)
  {
   printDirect (d);
  }
  }
}
Завдання . Перетворіть метод printDirect врекурсивний метод таким чином, щоб можна було переглянути інформацію про всіх підкаталогах поточного каталогу, незалежно від рівня вкладеності.
Метод CreateSubdirectory () дозволяє створити в обраному каталозі як єдиний підкаталог, так і безліч підкаталогів (в тому числі, і вкладених один в одного). Створимо в каталозі кілька додаткових підкаталогів:
DirectoryInfo dir = new DirectoryInfo (@ "d: \ prim");
dir.CreateSubdirectory ( "doc"); // створили підкаталог
dir.CreateSubdirectory (@ "book \ 2008"); // створили вкладений підкаталог
Завдання . Створіть вкладений підкаталог best \ 2008 рік для каталогу d: \ prim \ bmp .
Метод MoveTo () дозволяє перемістити поточний каталог по заданому в якості параметра адресою. При цьому можливо зробити перейменування каталогу. наприклад:
DirectoryInfo dir = new DirectoryInfo (@ "d: \ prim \ bmp");
dir.MoveTo (@ "d: \ prim \ letter \ bmp");
В даному випадку каталог bmp переміщається в за адресою d: \ prim \ letter \ bmp . Так як ім'я переміщуваного каталогу збігається з крайнім правим ім'ям в адресі нового місця розташування каталогу, то перейменування не відбувається. Наступний приклад дозволить нам перейменувати поточний каталог:
DirectoryInfo dir = new DirectoryInfo (@ "d: \ prim \ letter");
dir.MoveTo (@ "d: \ prim \ archive");
клас Directory
Працювати з каталогами файлової системи комп'ютера можна і за допомогою класу Directory , функціональні можливості якого багато в чому збігаються з можливостями DirectoryInfo . Але члени даного класу реалізовані статично, тому для їх використання немає необхідності створювати об'єкт.
Розглянемо роботу з методами даного класу на прикладах.
Зауваження . Видаліть з диска d змінену папку prim . І ще раз скопіюйте її вихідну версію з розділу 12 цього електронного підручника.
Directory.CreateDirectory (@ "d: \ prim \ 2008"); // створили підкаталог 2008
Directory.Move (@ "d: \ prim \ bmp", 
             @ "D: \ prim \ 2008 рік \ bmp"); // перенесли каталог bmp в каталог 2008
Directory.Move (@ "d: \ prim \ letter", 
             @ "D: \ prim \ archives"); // перейменували каталог letter в archives

Зауваження .
  1. Видалення каталогу можливо тільки тоді, коли він порожній.
  2. На практиці комбінують використання класів Directory і DirectoryInfo .

Комментариев нет:

Отправить комментарий