1. Вступ
Файл — це просто блок даних, який фізично зберігається на якомусь накопичувачі: жорсткому диску, SSD, флешці, ба навіть на дискеті (передайте привіт своєму дідусеві!). Для користувача файл — це щось, що можна відкрити, прочитати, змінити й зберегти.
У програмуванні файл — це послідовність байтів із певним імʼям і розташуванням, а для вас, як для програміста, — обʼєкт, у якого є імʼя, шлях до нього (наче адреса), розмір, дата створення тощо. Найголовніше: файл — це персистентне (стійке) сховище даних. Усе, що сталося в памʼяті під час виконання програми, зазвичай зникає після її завершення, а файл — лишається.
Що таке файлова система?
Файлова система — це спосіб зберігання й організації файлів на диску. Вона відповідає на запитання: де й як шукати файл, хто має до нього доступ, як саме влаштовані папки (каталоги), як знаходити імʼя файлу та його вміст.
Уявіть собі велику шафу, у якій багато шухляд. У кожній шухляді можуть бути папки, а в кожній папці — документи (файли). Щоб знайти свій конспект з C#, вам потрібно відкрити шафу, знайти потрібну шухляду, дістати папку і в ній — потрібний аркуш. Так файлова система організовує інформацію.
Популярні файлові системи
- NTFS — «рідна» файлова система Windows.
- FAT32, exFAT — для флешок, SD-карт, зовнішніх накопичувачів.
- EXT4 — популярна в Linux.
- APFS, HFS+ — macOS.
Для C#‑розробника це зазвичай несуттєво: .NET приховує деталі реалізації, а ви працюєте з абстракцією «файл/папка». Проте інколи ці знання стають у пригоді. Наприклад, у NTFS дозволено в імені файлу використовувати пробіли та багато спеціальних символів, а в FAT32 — ні.
2. Як влаштовані каталоги (папки)
Каталог (або папка) — це спеціальний тип файлу, що містить списки інших файлів і/або каталогів. Дерево каталогів (файлова ієрархія) — це той самий знайомий шлях від кореня до файлу: наприклад, C:\Users\Іван\Documents\MyFile.txt.
- Корінь — це початок диска (C:\).
- Усередині — папки (підпапки), у яких розміщено файли або інші папки.
Ось проста візуалізація:
C:\
└── Users\
└── Іван\
├── Documents\
│ └── MyFile.txt
└── Pictures\
└── Cat.jpg
3. Що таке шлях до файлу (file path)?
Шлях до файлу — це «адреса» файлу в дереві каталогів. За його допомогою можна однозначно знайти потрібний файл або папку.
Абсолютний і відносний шлях
- Абсолютний шлях: починається з кореня файлової системи.
Windows: C:\Users\Іван\Documents\MyFile.txt
Linux/macOS: /home/ivan/Documents/MyFile.txt - Відносний шлях: починається з поточного розташування (поточного каталогу).
Наприклад, якщо ваша програма запущена з папки C:\Users\Іван, то відносний шлях Documents\MyFile.txt вкаже на той самий файл.
Поточний каталог — це особливе поняття: це «точка відліку» для всіх відносних шляхів. Під час запуску програми зазвичай це папка, де міститься .exe‑файл, або та, звідки ви відкрили консоль.
Схема: Абсолютний і відносний шлях
Абсолютний шлях Відносний шлях
C:\Projects\MyApp\logs\output.txt logs\output.txt
└─ Корінь диску (C:) └─ Відносно запущеної MyApp
Роздільники у шляхах: \ і /
У Windows використовується зворотний слеш (\), а в Linux/macOS — зазвичай прямий (/).
Сучасний .NET підтримує обидва варіанти, але намагайтеся не змішувати їх в одному проєкті. Для побудови шляху завжди використовуйте спеціальне API (програмний інтерфейс застосунку), а не зʼєднуйте рядки вручну.
4. Як програма бачить файл
У .NET для роботи з файлами є широкий набір інструментів. Основні з них:
- System.IO.File: статичні методи для швидкого читання, запису, видалення, перевірки наявності файлів тощо.
- System.IO.Directory: аналогічні методи для роботи з папками.
- System.IO.FileInfo і System.IO.DirectoryInfo: обʼєктні обгортки з доступом до метаданих файлу/папки.
- System.IO.Path: клас‑помічник для роботи зі шляхами (зʼєднання шляхів, виділення розширення, імені тощо).
Трохи прикладів
Перевірка наявності файлу
using System.IO;
if (File.Exists("data.txt"))
{
Console.WriteLine("Файл знайдено!");
}
else
{
Console.WriteLine("Файл не знайдено!");
}
Отримання розміру файлу
var info = new FileInfo("data.txt");
Console.WriteLine($"Розмір файлу: {info.Length} байтів");
Роботу всіх прикладів ми розбиратимемо на найближчих лекціях. Зараз — просто подивіться і отримайте задоволення :)
5. Корисні нюанси
Метадані файлу: імʼя, розширення, розмір, дати тощо
Коли ви працюєте з файлом, важить не лише його вміст — є ще «паспорт файлу»:
- Імʼя — те, як файл називається для людини.
- Розширення — .txt, .jpg, .exe, .cs тощо: допомагає (інколи!) зрозуміти, що всередині.
- Розмір — кількість байтів.
- Час створення/зміни — можна дізнатися, коли файл зʼявився або востаннє змінювався.
- Атрибути — наприклад: файл лише для читання, прихований, системний.
У .NET для цього зручно використовувати класи FileInfo, DirectoryInfo (про це — в одній із наступних лекцій).
Розширення файлу та формати
Розширення файлу — це просто частина імені, що йде після крапки. Наприклад, у document.txt розширення txt. Операційна система використовує розширення, щоб зрозуміти, чим «відкривати» файл (наприклад, .jpg — програма для роботи із зображеннями, .xls — Excel тощо).
Але для вас, як для розробника, розширення — лише підказка. Реальний формат файлу визначається тільки його вмістом. Можна, наприклад, відкрити файл MyCat.jpg як текстовий — і побачити купу «абракадабри» (незрозумілі символи, але точно не зображення). Тож памʼятайте: розширення — не гарантія, а лише умовність.
Як влаштоване читання й запис файлу: базові поняття
Файл — це послідовність байтів. Робота з файлом у C# зазвичай передбачає:
- Відкриття файлу для читання або запису (або і того, й іншого).
- Читання даних у памʼять.
- Запис нових даних на диск.
- Закриття файлу — це дуже важливо, інакше ви заблокуєте системний ресурс (а хтось не зможе цей файл видалити, доки ви тримаєте його відкритим).
Сучасні API в .NET дбають про вас: наприклад, клас File уміє відкрити файл, прочитати й одразу закрити його. Але під час роботи з потоками (Stream) і великими файлами до цього варто ставитися серйозно (про це поговоримо на наступних лекціях).
Що важливо знати про кросплатформність
Майже весь сучасний C# працює під Windows, Linux і macOS практично однаково. Утім, є нюанси. Найпоширеніший — це різниця в роздільниках (\ vs /), а також обмеження на довжину імені файлу й заборонені символи.
Ось чому API типу Path.Combine і методи з System.IO.Path — ваші найкращі помічники. Вони «складуть» шлях правильно на будь-якій ОС. Ніколи не пишіть так:
var filePath = "C:\\Users\\Ivan\\data.txt"; // Лише для Windows!
Краще:
var filePath = Path.Combine("Users", "Ivan", "data.txt");
Як дізнатися поточний робочий каталог?
Іноді важливо зрозуміти, де саме будуть збережені ваші файли. Для цього є спеціальний клас:
string currentDir = Environment.CurrentDirectory;
Console.WriteLine($"Поточний каталог: {currentDir}");
До речі, якщо дати користувачеві можливість обирати шлях, використовуйте діалоги вибору файла/каталогу або аргументи командного рядка.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ