CodeGym /Kursy /C# SELF /Klasa Path — twój p...

Klasa Path — twój pomocnik przy pracy ze ścieżkami

C# SELF
Poziom 39 , Lekcja 4
Dostępny

1. Wprowadzenie

Po co w ogóle potrzebna klasa Path?

Praca z plikami jest niemożliwa bez pracy z ich ścieżkami. Ścieżka mówi programowi, gdzie dokładnie szukać potrzebnego pliku lub folderu.

W codziennym życiu masz adres: miasto [Nazwa miasta], ul. [Nazwa ulicy], nr [Numer domu]. Dla komputera ścieżka do pliku wygląda mniej więcej tak:
"C:\Program Files\MyApp\data.txt"
albo, jeśli jesteś zwolennikiem cross-platformowości:
"/home/username/documents/data.txt"

Ale jest problem: różne OS używają różnych separatorów w ścieżkach, mogą mieć różne ograniczenia długości czy dozwolonych znaków. Nawet użytkownik wpisując ręcznie ścieżkę do pliku łatwo się pomyli: nie każdy wie o podstępnych podwójnych odwrotnych ukośnikach (\\) w Windows albo o tym, że w systemach Unix-podobnych ścieżka zaczyna się od /.

Żeby nie wynajdować koła na nowo, .NET daje specjalną statyczną klasę System.IO.Path, która bierze na siebie całą robotę z parsowaniem, modyfikacją i składaniem ścieżek. Poznajmy tego superbohatera bliżej!

Główne zadania, które rozwiązuje Path

  • Uzyskiwanie rozszerzenia pliku.
  • Uzyskiwanie nazwy pliku lub katalogu z pełnej ścieżki.
  • Budowanie ścieżek absolutnych i relatywnych z kawałków.
  • Sprawdzanie, czy ścieżka jest walidna dla danej OS.
  • Zmiana rozszerzenia pliku.
  • Określenie katalogu bazowego i katalogów nadrzędnych.
  • Cross-platformowa praca z separatorami ścieżek.
  • Praca z plikami i katalogami tymczasowymi.

Tabela: Główne metody i właściwości Path

Metoda/Właściwość Co robi
GetFileName(path)
Nazwa pliku z rozszerzeniem
GetExtension(path)
Rozszerzenie pliku (np. .txt)
GetDirectoryName(path)
Ścieżka do folderu, w którym jest plik
GetFileNameWithoutExtension(path)
Nazwa pliku bez rozszerzenia
Combine(...)
Skleja elementy ścieżki poprawnie i cross-platformowo
ChangeExtension(path, ext)
Zamienia rozszerzenie pliku
GetFullPath(path)
Ścieżka absolutna
GetInvalidPathChars()
Znaki niedozwolone w ścieżce
GetInvalidFileNameChars()
Znaki niedozwolone w nazwie
GetTempPath()
Ścieżka do folderu na pliki tymczasowe
GetTempFileName()
Tworzy plik tymczasowy i zwraca jego ścieżkę
DirectorySeparatorChar
Separator katalogów (np. \ lub /)
AltDirectorySeparatorChar
Alternatywny separator
PathSeparator
Separator ścieżek w zmiennych środowiskowych (; lub :)

2. Pobieranie części ścieżki

Prawie wszystkie metody klasy Path są statyczne. Nie trzeba tworzyć instancji — po prostu wywołujesz Path.NazwaMetody(...).

Najczęściej używane narzędzia: GetFileName, GetDirectoryName, GetExtension, GetFileNameWithoutExtension. W każdej chwili możesz potrzebować wyciągnąć nazwę pliku bez ścieżki, dowiedzieć się tylko rozszerzenia lub folderu, w którym się znajduje.

Przykład:


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
Kod Wynik
@"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. Sklejanie ścieżek: Combine

Najczęstszy błąd początkującego — składanie ścieżek przez zwykłą konkatenację stringów. Nie rób tak!

Przykład złego kodu:


// Pełne pole do błędów!
string fullPath = "C:\\Projects\\MyApp\\" + "data\\info.json";

Co jeśli zapomnisz dodać slash/backslash? Albo pomylisz separator?
Poprawny sposób — użyć Path.Combine.


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

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

// Na każdej platformie poprawnie skleja segmenty ścieżki!
Console.WriteLine(fullPath); // C:\Projects\MyApp\data\info.json

Praca z ścieżkami relatywnymi

Jeśli przekażesz ścieżkę relatywną, Path.Combine poprawnie ją obsłuży. Staraj się dzielić ścieżkę właśnie na segmenty!


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

string path = Path.Combine(baseDir, subDir, file);
// Wynik: "C:/work/docs/readme.txt" (albo z odwrotnymi ukośnikami — zależy od platformy)

Fakt dla znawców: wewnątrz Path.Combine używany jest właściwy separator dla twojego OS. W Windows — \, w Linux/Mac — /. Twój kod staje się cross-platformowy, nawet jeśli o tym nie myślałeś!

4. Sprawdzanie walidności ścieżki

Do tego są specjalne metody: GetInvalidPathChars, GetInvalidFileNameChars.

Załóżmy, że użytkownik wpisał nazwę pliku lub ścieżkę przez UI. Jak upewnić się, że string nie zawiera zabronionych znaków? Po prostu zapytaj 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($"Niedozwolony znak w nazwie pliku: {c}");
    }
}
// Wyświetli: Niedozwolony znak w nazwie pliku: *

To szczególnie ważne, jeśli program dostaje ścieżki od użytkownika albo z niedużo zaufanych źródeł!

5. Przydatne metody

Zmienianie rozszerzenia pliku: ChangeExtension

Czasami trzeba zmienić rozszerzenie pliku na inne. Robi się to jedną linijką!


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

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

ChangeExtension nie rusza reszty ścieżki — tylko podmienia "ogon".

Uzyskiwanie ścieżki absolutnej: GetFullPath

Jeśli ścieżka jest relatywna, możesz dostać absolutną (pełną) ścieżkę za pomocą tej metody.


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

Console.WriteLine(absPath);
// Na przykład: C:\Projects\MyApp\logs\2024.log

Rzeczywisty wynik zależy od bieżącego katalogu roboczego aplikacji (Directory.GetCurrentDirectory()).

Separatory ścieżek: Path.DirectorySeparatorChar

Przypomnij sobie, jak w Windows separator to \, a w Linux — /.
Nie kombinuj — używaj tych właściwości:

  • Path.DirectorySeparatorChar — główny separator katalogów na twoim OS ('\\' dla Windows, '/' dla Linux).
  • Path.AltDirectorySeparatorChar — alternatywny separator ('/' też może działać w Windows).
  • Path.PathSeparator — separator ścieżek w zmiennych środowiskowych (';' dla Windows, ':' dla Linux).

Użycie:


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

To istotne, jeśli na przykład budujesz swoje własne rozwiązanie do obchodzenia katalogów!

6. Praca z plikami i katalogami tymczasowymi

Każdy program czasem potrzebuje plików tymczasowych — np. do przechowania wyników pośrednich albo do atomowej aktualizacji danych.

  • Path.GetTempPath() — zwróci ścieżkę do systemowego folderu na pliki tymczasowe.
  • Path.GetTempFileName() — utworzy plik tymczasowy z unikalną nazwą i zwróci jego ścieżkę.

Przykład:


string tempDir = Path.GetTempPath();
Console.WriteLine($"Folder na pliki tymczasowe: {tempDir}");

string tempFile = Path.GetTempFileName();
Console.WriteLine($"Utworzono plik tymczasowy: {tempFile}");

Te metody ratują przed konfliktami nazw i dbaniem o to, gdzie trzymać pliki techniczne.

7. Częste błędy i zabawne przypadki ze ścieżkami

Po pierwsze, nawyk składania ścieżki zwykłym dodawaniem stringów. "O, to przecież proste: folder + "\\\" + file"! W praktyce: podwójne slashe, brakujące slashe, nieprawidłowe separatory dla Linux. To wszystko nie jest bugiem, tylko featurem, jeśli nie używasz Path.Combine.

Po drugie, zapominają o zabronionych znakach. Na przykład użytkownik wpisuje * ("gwiazdka") w nazwie pliku — dostaniesz wyjątek.

Po trzecie, mylą ścieżki relatywne i absolutne, przez co program szuka pliku "notebook.txt" nie tam, gdzie się spodziewasz.

Wskazówka: przy każdej operacji na ścieżce pliku — sklejenie, parsowanie, zmiana rozszerzenia, ochrona przed błędami — zapytaj siebie najpierw: "Czy to nie da się rozwiązać metodą z Path?" Z prawdopodobieństwem 99% — tak, i ta metoda już została przetestowana przez zespół Microsoft na wszystkich szalonych edge-case'ach.

1
Ankieta/quiz
Klasy File i Directory, poziom 39, lekcja 4
Niedostępny
Klasy File i Directory
Praca z systemem plików
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION