Підрозділ 18.2
Класи FileInfo та DirectoryInfo
18.2. Класи FileInfo та DirectoryInfo У розділі 18.1 ми розглянули статичні класи Path , File та Directory , кожен з яких виконує операцію атомарно: відкрив → зробив → закрив. Це зручно для разових дій, але нее
18.2. Класи FileInfo та DirectoryInfo
У розділі 18.1 ми розглянули статичні класи Path, File та Directory, кожен з яких виконує операцію атомарно: відкрив → зробив → закрив. Це зручно для разових дій, але неефективно, коли потрібно виконати кілька операцій над одним і тим самим ресурсом. Саме для таких сценаріїв C# надає об'єктні аналоги — класи FileInfo та DirectoryInfo.
На відміну від статичних класів, FileInfo і DirectoryInfo — екземплярні класи: ви створюєте об'єкт, що представляє конкретний файл або директорію, і далі вся робота відбувається через цей об'єкт. Ключова перевага — безпека і одноразова авторизація: при першому зверненні операційна система перевіряє права доступу один раз, результат кешується в об'єкті, і всі подальші операції не повторюють цю перевірку.

Клас FileInfo — об'єктне представлення файлу
FileInfo надає той самий набір операцій, що і статичний File, але через інтерфейс об'єкта: метадані файлу зберігаються у властивостях, а операції викликаються як методи екземпляра.
Створення об'єкта та властивості
Методи FileInfo — операції над файлом
fi.MoveTo(...) оновлює внутрішній стан об'єкта — після виклику fi.FullName і fi.Name відображають нове розташування файлу. Це суттєва відмінність від статичного File.Move, після якого ви маєте будувати новий шлях вручну.
Відкриття потоків через FileInfo
FileInfo надає методи для відкриття різних видів потоків — це зручно, коли потрібен потоковий доступ замість атомарного читання/запису:
fi.Refresh() — важливий метод: FileInfo кешує метадані (розмір, час змін) при першому зверненні. Якщо файл змінився після створення об'єкта, кешовані дані застаріють. Виклик Refresh() примусово перечитує метадані з диску.
Клас DirectoryInfo — об'єктне представлення директорії
DirectoryInfo — об'єктний аналог статичного Directory. Представляє конкретну директорію і надає методи для роботи з нею та її вмістом через інтерфейс об'єкта.
Властивості та методи
Ключова відмінність DirectoryInfo.GetFiles() від Directory.GetFiles(): перший повертає FileInfo[] — повноцінні об'єкти з метаданими (розмір, час, атрибути). Другий повертає лише string[] — масив рядків-шляхів. Якщо вам потрібні метадані файлів після переліку, DirectoryInfo економить один додатковий виклик на кожен файл.
Створення ієрархії та навігація
CreateSubdirectory — метод, що повертає DirectoryInfo для щойно створеної підтеки. Це дозволяє будувати ієрархії тек у fluent-стилі, не будуючи шляхи вручну. Властивість Parent забезпечує навігацію вгору, Root — одразу до кореня.
FileSystemInfo — спільний базовий клас
FileInfo і DirectoryInfo успадковують від абстрактного класу FileSystemInfo. Це дозволяє писати поліморфний код, що працює як з файлами, так і з директоріями:
FileSystemInfo містить спільні властивості: Name, FullName, Exists, CreationTime, LastWriteTime, LastAccessTime, Attributes. Метод GetFileSystemInfos() повертає суміш FileInfo і DirectoryInfo об'єктів для всіх записів у теці.
FileInfo vs File — порівняння підходів
Правило вибору:
File/Directory— одна операція, результат не потрібен відразу, метадані не важливіFileInfo/DirectoryInfo— кілька операцій над тим самим ресурсом, або потрібні метадані файлу (розмір, час, атрибути)
Практичний сценарій: аналіз архіву медичних записів
Об'єднаємо можливості FileInfo та DirectoryInfo у реальному сценарії — побудова зведеного звіту по архіву медичних записів:
