CodeGym /Kurslar /C# SELF /Klass Path — yol il...

Klass Path — yol ilə işləyərkən sizin köməkçiniz

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Niyə ümumiyyətlə Path klassına ehtiyac var?

Fayllarla işləmək üçün onların yolları ilə işləmək vacibdir. Yol proqramaya göstərir ki, lazım olan faylı və ya qovluğu harada axtarmalı.

Gündəlik həyatda sizin ünvanınız var: şəhər [Şəhərin adı], küçə [Küçənin adı], ev [Ev nömrəsi]. Kompüter üçün faylın yolu təxminən belə görünür:
"C:\Program Files\MyApp\data.txt"
və ya əgər cross-platform tərəfdarisinizsə:
"/home/username/documents/data.txt"

Amma problem budur: müxtəlif OSlər fərqli separatorlardan istifadə edir, uzunluq məhdudiyyətləri və ya icazə verilən simvollar fərqli ola bilər. Hətta istifadəçi yol daxil edərkən səhv edə bilər: hamı Windowsdakı ikiqat backslash-lardan (\\) və ya Unix-lərdə yolun / ilə başlamasından xəbərdar deyil.

Velosiped düzəltməmək üçün .NET xüsusi bir statik klass təqdim edir — System.IO.Path, hansı ki yolların parçalanması, dəyişdirilməsi və birləşdirilməsini öz üzərinə götürür. Gəlin bu super qəhrəmanla yaxından tanış olaq!

Path tərəfindən həll edilən əsas vəzifələr

  • Faylın uzantısını almaq.
  • Tam yoldan faylın və ya direktoriyanın adını çıxarmaq.
  • Parçalardan absolut və nisbət yolları qurmaq.
  • Yolun həmin OS üçün etibarlı olub-olmadığını yoxlamaq.
  • Faylın uzantısını dəyişmək.
  • Baza direktoriyanı və valideyn qovluqları müəyyən etmək.
  • Yolların separatorları ilə cross-platform işləmək.
  • Müvəqqəti fayl və qovluqlarla işləmək.

Cədvəl: Pathın əsas metodları və xassələri

Metod/Xassə İşi
GetFileName(path)
Uzanma ilə fayl adı
GetExtension(path)
Faylın uzantısı (məsələn, .txt)
GetDirectoryName(path)
Faylın yerləşdiyi qovluğun yolu
GetFileNameWithoutExtension(path)
Uzanma olmadan fayl adı
Combine(...)
Yol elementlərini diqqətlə və cross-platform uyğun birləşdirir
ChangeExtension(path, ext)
Faylın uzantısını dəyişir
GetFullPath(path)
Absolut yol
GetInvalidPathChars()
Yolda qadağan olunmuş simvollar
GetInvalidFileNameChars()
Adın daxilində qadağan olunmuş simvollar
GetTempPath()
Müvəqqəti fayllar üçün qovluğun yolu
GetTempFileName()
Müvəqqəti fayl yaradır və onun yolunu qaytarır
DirectorySeparatorChar
Direktoriyaların separatoru (məsələn, \ və ya /)
AltDirectorySeparatorChar
Alternativ separator
PathSeparator
Ətraf mühit dəyişənlərində yolların separatoru (; və ya :)

2. Yolun hissələrini almaq

Demək olar ki, Path klassının bütün metodları statikdir. Instans yaratmağa ehtiyac yoxdur — sadəcə Path.MetodAdi(...) çağırın.

Ən çox istifadə olunan alətlər: GetFileName, GetDirectoryName, GetExtension, GetFileNameWithoutExtension. Hər zaman faylın yolunu olmadan adını çıxarmaq, yalnız uzantını öyrənmək və ya onun olduğu qovluğu tapmaq lazım ola bilər.

Nümunə:


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 Nəticə
@"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. Yolların birləşdirilməsi: Combine

Yeni başlayanların ən yaygın səhvi — yolları adi string konkatenasiyası ilə birləşdirmək. Belə etməyin!

Səhv nümunə kod:


// Problemli ola bilər!
string fullPath = "C:\\Projects\\MyApp\\" + "data\\info.json";

Əgər slash/backslash qoymağı unutmusunuzsa nə olar? Və ya separatorla səhv etsəniz?
Düzgün yol — Path.Combine istifadə etməkdir.


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

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

// Hər platformada segmentləri düzgün birləşdirəcək!
Console.WriteLine(fullPath); // C:\Projects\MyApp\data\info.json

Nisbət yollarla işləmək

Əgər nisbət yol versəniz, Path.Combine onu düzgün emal edəcək. Yolu məhz segmentlərə bölməyə çalışın!


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

string path = Path.Combine(baseDir, subDir, file);
// Nəticə: "C:/work/docs/readme.txt" (və ya backslash ilə — platformadan asılıdır)

Maraqlı fakt: Path.Combine daxilində sizin OS üçün düzgün separator istifadə olunur. Windows-da — \, Linux/Mac-də — /. Kodunuz cross-platform uyğun olur, hətta siz buna fikir verməsəniz belə!

4. Yolun etibarlılığını yoxlamaq

Bunun üçün xüsusi metodlar var: GetInvalidPathChars, GetInvalidFileNameChars.

Məsələn, istifadəçi interfeysindən fayl adı və ya yol daxil edibsə, string-də qadağan olunmuş simvolların olmadığından necə əmin olmaq olar? Sadəcə Path-ə soruşun.


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($"Yaddaş olmaz simvol fayl adında: {c}");
    }
}
// Çap edəcək: Yaddaş olmaz simvol fayl adında: *

Bu xüsusilə vacibdir, əgər proqram istifadəçidən və ya etibarsız mənbələrdən yollar alırsa!

5. Faydalı metodlar

Fayl uzantısını dəyişmək: ChangeExtension

Bəzən faylın uzantısını başqa ilə dəyişmək lazım olur. Bir sətrdə edilir!


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

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

ChangeExtension yolun digər hissələrinə toxunmur — yalnız "quyruğu" əvəz edir.

Absolut yolu almaq: GetFullPath

Əgər yol nisbətdirsə, bu metodla onun absolut (tam) yolunu ala bilərsiniz.


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

Console.WriteLine(absPath);
// Məsələn: C:\Projects\MyApp\logs\2024.log

Real nəticə tətbiqin cari iş qovluğundan (Directory.GetCurrentDirectory()) asılıdır.

Yol separatorları: Path.DirectorySeparatorChar

Xatırlayın, Windows-da separator — \, Linux-da — /.
Yarışmayın — bu xassələrdən istifadə edin:

  • Path.DirectorySeparatorChar — sizin OS-də əsas direktoriyaseparatoru ('\\' Windows üçün, '/' Linux üçün).
  • Path.AltDirectorySeparatorChar — alternativ separator (məsələn, Windows-da '/' də işləyə bilər).
  • Path.PathSeparator — ətraf mühit dəyişənlərində yolların separatoru (Windows üçün ';', Linux üçün ':').

İstifadə nümunəsi:


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

Bu aktualdır, əgər məsələn direktoriyalarda öz yol-düzəltmə alqoritminizi yazırsınızsa!

6. Müvəqqəti fayllar və kataloqlarla işləmək

Hər proqram bəzən müvəqqəti fayllara ehtiyac duyur — məsələn, ara nəticələri saxlamaq və ya atomik yeniləmə üçün.

  • Path.GetTempPath() — sistem üçün müvəqqəti fayllar qovluğunun yolunu qaytarır.
  • Path.GetTempFileName() — unikal adla müvəqqəti fayl yaradır və onun yolunu qaytarır.

Nümunə:


string tempDir = Path.GetTempPath();
Console.WriteLine($"Müvəqqəti fayllar üçün qovluq: {tempDir}");

string tempFile = Path.GetTempFileName();
Console.WriteLine($"Yaradılmış müvəqqəti fayl: {tempFile}");

Bu metodlar ad toqquşmalarından və texniki faylların harada saxlanacağı barədə qayğıdan xilas edir.

7. Yollarla bağlı tez-tez olunan səhvlər və maraqlı hallar

Birincisi, yolun sadə string toplaması ilə qurulması vərdişi. "Aa, bu çox sadədir: folder + "\\\" + file"! Praktikada: ikiqat slashlar, unutulmuş slashlar, Linux üçün səhv separatorlar. Bütün bunlar problemə çevrilir, əgər Path.Combine istifadə etmirsinizsə.

İkincisi, qadağan olunmuş simvollardan xəbərsiz olmaq. Məsələn, istifadəçi fayl adında * («ulduz») daxil edirsə — istisna ilə üzləşəcəksiniz.

Üçüncüsü, nisbət və absolut yolları qarışdırmaq — nəticədə proqram faylı gözlədiyiniz yerdə tapmaya bilər, məsələn "notebook.txt" başqa qovluqda axtarılır.

Məsləhət: fayl yolunu hər hansı əməliyyatda birləşdirmə, parçalama, uzantı dəyişmə və ya səhv qorunması edərkən ilk növbədə özünüzdən soruşun: "Bu məsələ Path klassının metoduyla həll edilə bilərmi?" 99% ehtimalla — bəli, və bu metod Microsoft komandası tərəfindən bütün qəribə edge-case-lərə qarşı test edilib.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
File və Directory sinifləri
Fayl sistemi ilə işləmək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION