JavaRush /Курси /C# SELF /Клас Path — ваш пом...

Клас Path — ваш помічник у роботі зі шляхами

C# SELF
Рівень 39 , Лекція 4
Відкрита

1. Вступ

Навіщо взагалі потрібен клас Path?

Робота з файлами неможлива без роботи з їхніми шляхами. Саме шлях підказує програмі, де шукати потрібний файл чи теку.

У повсякденному житті ви маєте адресу: м. [Назва міста], вул. [Назва вулиці], буд. [Номер будинку]. Для комп’ютера шлях до файлу виглядає приблизно так:
"C:\Program Files\MyApp\data.txt"
або, якщо ви дбаєте про кросплатформність:
"/home/username/documents/data.txt"

Але є проблема: різні ОС використовують різні розділювачі у шляхах, можуть мати різні обмеження на довжину або допустимі символи. Навіть користувач, вводячи вручну шлях до файлу, легко помилиться: не всі знають про підступні подвійні зворотні слеші (\\) у Windows або про те, що в Unix-подібних системах шлях починається з /.

Щоб не винаходити велосипед, .NET надає спеціальний статичний клас System.IO.Path, який бере на себе всю роботу з розбору, зміни й об’єднання шляхів. Познайоммося з цим «супергероєм» ближче!

Основні завдання, які вирішує Path

  • Отримання розширення файлу.
  • Отримання імʼя файлу або теки з повного шляху.
  • Побудова абсолютних і відносних шляхів з частин.
  • Перевірка, чи шлях коректний для цієї ОС.
  • Заміна розширення файлу.
  • Визначення базової теки та батьківських тек.
  • Кросплатформна робота з розділювачами шляхів.
  • Робота з тимчасовими файлами й теками.

Таблиця: Головні методи й властивості Path

Метод/Властивість Що робить
GetFileName(path)
Імʼя файлу з розширенням
GetExtension(path)
Розширення файлу (наприклад, .txt)
GetDirectoryName(path)
Шлях до теки, у якій міститься файл
GetFileNameWithoutExtension(path)
Імʼя файлу без розширення
Combine(...)
Акуратно й кросплатформно об’єднує елементи шляху
ChangeExtension(path, ext)
Змінює розширення файлу
GetFullPath(path)
Абсолютний шлях
GetInvalidPathChars()
Заборонені символи в шляху
GetInvalidFileNameChars()
Заборонені символи в імені
GetTempPath()
Шлях до теки для тимчасових файлів
GetTempFileName()
Створює тимчасовий файл і повертає до нього шлях
DirectorySeparatorChar
Розділювач тек (наприклад, \ або /)
AltDirectorySeparatorChar
Альтернативний розділювач
PathSeparator
Розділювач шляхів у змінних середовища (; або :)

2. Отримання частин шляху

Майже всі методи класу Path статичні. Не потрібно створювати екземпляр — просто викликайте Path.НазваМетоду(...).

Найуживаніші інструменти: GetFileName, GetDirectoryName, GetExtension, GetFileNameWithoutExtension. Часто може знадобитися витягти імʼя файлу без шляху, дізнатися лише розширення або теку, у якій він міститься.

Приклад:


using System;
using System.IO;

string path = @"C:\Projects\MyApp\data\info.json";

Console.WriteLine(Path.GetFileName(path));               // info.json
Console.WriteLine(Path.GetFileNameWithoutExtension(path)); // info
Console.WriteLine(Path.GetExtension(path));              // .json
Console.WriteLine(Path.GetDirectoryName(path));          // C:\Projects\MyApp\data
Код Результат
@"C:\Projects\MyApp\data\info.json"
info.json
Path.GetFileName(path)
Path.GetExtension(path)
.json
Path.GetFileNameWithoutExtension(path)
info
Path.GetDirectoryName(path)
C:\Projects\MyApp\data

3. Об’єднання шляхів: Combine

Найпоширеніша помилка новачка — складати шляхи через звичайну конкатенацію рядків. Так робити не варто!

Приклад неправильного коду:


// Це загрожує помилками!
string fullPath = "C:\\Projects\\MyApp\\" + "data\\info.json";

А що, як забути поставити слеш або бекслеш? Або помилитися з розділювачем?
Правильний спосіб — використовувати Path.Combine.


string folder = @"C:\Projects\MyApp";
string filename = "data\\info.json";

string fullPath = Path.Combine(folder, filename);

// На будь-якій платформі правильно склеїть сегменти шляху!
Console.WriteLine(fullPath); // C:\Projects\MyApp\data\info.json

Робота з відносними шляхами

Якщо передати відносний шлях, Path.Combine коректно його обробить. Намагайтеся розбивати шлях на окремі сегменти!


string baseDir = "C:/work";
string subDir = "docs";
string file = "readme.txt";

string path = Path.Combine(baseDir, subDir, file);
// Підсумок: "C:/work/docs/readme.txt" (або зі зворотними слешами — залежить від платформи)

Факт для знавців: усередині Path.Combine використовується правильний розділювач для вашої ОС. У Windows — \, у Linux/macOS — /. Ваш код стає кросплатформним, навіть якщо ви про це не думали!

4. Перевірка коректності шляху

Для цього є спеціальні методи: GetInvalidPathChars, GetInvalidFileNameChars.

Припустімо, користувач ввів імʼя файлу або шлях через інтерфейс. Як переконатися, що рядок не містить заборонених символів? Просто запитайте у Path.


char[] invalidPathChars = Path.GetInvalidPathChars();
char[] invalidFileNameChars = Path.GetInvalidFileNameChars();

string userInput = "data*?.txt";
foreach (char c in userInput)
{
    if (Array.Exists(invalidFileNameChars, x => x == c))
    {
        Console.WriteLine($"Неприпустимий символ в імені файлу: {c}");
    }
}
// Виведе: Неприпустимий символ в імені файлу: *

Це особливо важливо, якщо програма отримує шляхи від користувача або з ненадійних джерел!

5. Корисні методи

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

Іноді потрібно змінити розширення файлу на інше. Це робиться одним рядком!


string oldPath = @"C:\data\report.csv";
string newPath = Path.ChangeExtension(oldPath, ".bak");

Console.WriteLine(newPath); // C:\data\report.bak

ChangeExtension не змінює іншу частину шляху — лише підміняє «хвіст».

Отримання абсолютного шляху: GetFullPath

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


string relPath = @"..\..\logs\2024.log";
string absPath = Path.GetFullPath(relPath);

Console.WriteLine(absPath);
// Наприклад: C:\Projects\MyApp\logs\2024.log

Реальний результат залежить від поточної робочої теки застосунку (Directory.GetCurrentDirectory()).

Розділювачі шляхів: Path.DirectorySeparatorChar

Згадайте, що в Windows розділювач — \, а в Linux — /.
Не ускладнюйте — користуйтеся цими властивостями:

  • Path.DirectorySeparatorChar — головний розділювач теки у вашій ОС ('\\' для Windows, '/' для Linux).
  • Path.AltDirectorySeparatorChar — альтернативний розділювач ('/' також може працювати у Windows).
  • Path.PathSeparator — розділювач шляхів у змінних середовища (';' для Windows, ':' для Linux).

Використання:


Console.WriteLine(Path.DirectorySeparatorChar);     // \  (у Windows)
Console.WriteLine(Path.AltDirectorySeparatorChar);  // /  (у Windows)
Console.WriteLine(Path.PathSeparator);              // ;  (у Windows)

Це актуально, якщо, наприклад, ви будуєте власний «велосипед» для обходу тек!

6. Робота з тимчасовими файлами й теками

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

  • Path.GetTempPath() — повертає шлях до системної теки для тимчасових файлів.
  • Path.GetTempFileName() — створює тимчасовий файл з унікальною назвою і повертає його шлях.

Приклад:


string tempDir = Path.GetTempPath();
Console.WriteLine($"Тека для тимчасових файлів: {tempDir}");

string tempFile = Path.GetTempFileName();
Console.WriteLine($"Створено тимчасовий файл: {tempFile}");

Ці методи рятують від конфліктів імен і клопоту про те, де зберігати технічні файли.

7. Поширені помилки й кумедні казуси зі шляхами

По-перше, звичка збирати шлях простим додаванням рядків. «О, це ж так просто: folder + "\\\" + file»! На практиці: подвійні слеші, пропущені слеші, неправильні розділювачі для Linux. Усе це — не «фіча», а джерело багів, якщо ви не використовуєте Path.Combine.

По-друге, забувають про заборонені символи. Наприклад, користувач вводить * («зірочка») в імені файлу — отримаєте виняток.

По-третє, плутають відносні й абсолютні шляхи, через що програма шукає файл "notebook.txt" не там, де ви його очікували.

Порада: під час будь-якої роботи зі шляхом файла — об’єднання, розбір, зміна розширення, захист від помилок — насамперед запитайте себе: «Чи не розв’язується це завдання методом із Path?» З імовірністю 99 % — так; і цей метод уже протестований командою Microsoft на всіх граничних випадках.

1
Опитування
Класи File та Directory, рівень 39, лекція 4
Недоступний
Класи File та Directory
Робота з файловою системою
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ