1. Giriş
Təsəvvür edin ki, istifadəçi şəkillərini yüklədiyi bir proqram yazırsınız. Onları bir qovluqda sadəcə "yığın" şəklində saxlamaq yerinə ayrıca qovluqlar yaratmaq yaxşıdır — tarixə görə və ya istifadəçi adına görə. Yaxud proqramınız hesabatlar yaradırsa: nəticələri xüsusi bir qovluğa yığmaq məntiqlidir, onu da lazım olanda dinamik yaratmaq lazımdır. İşi bitirdikdən sonra müvəqqəti qovluqları silmək isə düz-əməlli kodun işi və istifadəçini zibildən azad etməkdir.
Qovluqlarla işləmək bir çox tətbiqlərdə standart tapşırıqdır: backup-dan tutmuş oyunlara qədər, oyunlar öz save-lərini qovluqlara qoymaq istəyir. Müsahibələrdə də bu mövzu tez-tez çıxır, çünki burada sadəcə "yarat" və ya "sil" əmri yox, qeyri-adi vəziyyətlərdə necə davranmaq lazım olduğunu da başa düşmək vacibdir.
Qovluq — fayl sistemində digər fayl və qovluqlar üçün konteynerdir. Qovluqlar ağac strukturu (filesystem tree) yaradır: hər qovluğun valideyni var (əgər kök deyilsə) və çoxlu uşaq qovluqları ola bilər.
2. Qovluq necə yaratmaq olar? Statik sinif Directory
Ən sadə yol statik Directory.CreateDirectory metodundan istifadə etməkdir. Heç bir obyekt yaratmağa ehtiyac yoxdur, sadəcə yolu verin:
using System.IO;
// Cari qovluqda "Reports" qovluğunu yaradır
Directory.CreateDirectory("Reports");
Əgər belə bir qovluq artıq varsa, metod heç nə etmir və səhv atmır — CreateDirectory-i təhlükəsiz şəkildə çağıra bilərsiniz, qovluğun olub-olmadığını düşünmədən.
Gəlin daha mürəkkəb bir yol qoyaq, məsələn, iç-içə qovluq yaradaq:
Directory.CreateDirectory(@"Data\Photos\2024\June");
Bu çağırış zənciri təşkil edən bütün qovluqları yaradacaq, əgər arada olmayan qovluqlar varsa. Buna rekursiv yaradılma deyilir — Directory.CreateDirectory bütün detallar haqqında özü fikirləşir.
Diqqət! Yol göstərişlərində Windows üçün ikiqat əks slash (\\) və ya düz slash (/) istifadə edin. Daha yaxşısı — əvvəllər danışdığımız Path.Combine.
CreateDirectory nə qaytarır?
Metod DirectoryInfo tipində obyekt qaytarır. Bu yaxşıdır, əgər siz həmin qovluqla dərhal işləmək istəyirsinizsə:
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"Qovluq yaradıldı: {reportsDir.FullName}");
Qovluğun mövcudluğunu necə yoxlamaq olar?
Hər hansı əməliyyat etməzdən əvvəl qovluğun mövcudluğunu yoxlamaq faydalıdır. Bunun üçün statik metod var:
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("Qovluq tapılmadı, indi yaradacağıq!");
Directory.CreateDirectory("Reports");
}
Qeyd: Yaratmadan əvvəl yoxlamaq məcburi deyil: metod problem yaratmayacaq, əgər qovluq varsa. Amma istifadəçiyə gözəl mesaj göstərmək və ya fərqli məntiq yürütmək istəyirsinizsə, bu yanaşma faydalıdır.
3. Qovluqların yaradılması: praktik halları
Gəlin bu bilikləri tədris proqramımıza tətbiq edək. Tutaq ki, istifadəçi qeydlərini aparırıq və hər istifadəçi üçün ayrıca qovluq saxlamaq istəyirik:
// Faylın yuxarısına System.IO əlavə edək, əgər yoxdursa
using System.IO;
Console.Write("İstifadəçi adını daxil edin: ");
string userName = Console.ReadLine() ?? "Unknown";
// İstifadəçi qovluğunun yolunu yığırıq
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// İstifadəçi üçün qovluğu yaradırıq (və lazım olarsa valideyn qovluqları)
Directory.CreateDirectory(userPath);
Console.WriteLine($"İstifadəçi üçün qovluq \"{userName}\" hazırdır: {Path.GetFullPath(userPath)}");
Yuxarıdakı nümunə fayl strukturunu yaradacaq (əgər yox idisə):
UsersData/
└── IstifadəçiAdi/
Məsləhət: yol hissələrini birləşdirərkən həmişə Path.Combine istifadə edin — belə kodunuz həm Windows-da, həm də Linux/Mac-də düzgün işləyəcək.
4. Qovluğu necə silmək olar? Metod Directory.Delete
Qovluğu silmək demək olar ki, yaratmaq qədər sadədir. Amma bəzi nüanslar var.
Directory.Delete("Reports");
Əgər qovluq mövcuddur və boşdursa — rahat şəkildə silinəcək. Amma içində nəsə varsa, istisna atılacaq:
System.IO.IOException: "The directory is not empty."
Məzmunla birlikdə qovluğu silmək lazım olsa?
Bunun üçün metodun overload-u var — recursive: true parametrli:
Directory.Delete("Reports", recursive: true);
DIQQƏT: Recursive silmə qovluğun içindəkilərin hamısını geri dönməz şəkildə məhv edir. Əgər səhv qovluğu göstərəcəksinizsə, vacib məlumatları itirə bilərsiniz. Həmişə yolun düzgünlüyünü iki dəfə yoxlayın!
Nümunə
İstifadəçi hesabını siləndə onun qovluğunu da silmək imkanı əlavə edək:
// Soruşuruq, silmək lazımdırmı
Console.Write("İstifadəçi qovluğunu silmək? (y/n): ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// İçindəkilərlə birlikdə silirik
Directory.Delete(userPath, recursive: true);
Console.WriteLine("İstifadəçi qovluğu silindi!");
}
else
{
Console.WriteLine("Qovluq artıq mövcud deyil.");
}
}
5. Cədvəl: Qovluqlarla işləməyin əsas metodları
| Əməliyyat | Metod | Xüsusiyyətlər |
|---|---|---|
| Qovluq yaratmaq | |
Yol üzrə bütün qovluqları rekursiv şəkildə yaradır |
| Mövcudluğu yoxlamaq | |
true və ya false qaytarır |
| Boş qovluğu silmək | |
Qovluq boş deyilsə, səhv atır |
| Məzmunla birlikdə qovluğu silmək | |
İçindəkiləri geri dönməz şəkildə silir |
| Faylların siyahısını almaq | |
Fayl adlarını qaytarır |
| Alt qovluqların siyahısını almaq | |
Qovluq adlarını qaytarır |
6. Gözlənilməz məqamlar və tipik səhvlər
Yaratma zamanı səhv: icazə yoxdursa və ya yol düzgün deyilsə
Əgər sistem qovluqlarında (məsələn, "C:\Windows\System32\SuperApp") qovluq yaratmağa çalışırsınızsa, çox güman ki, UnauthorizedAccessException və ya IOException ilə üzləşəcəksiniz.
Praktik məsləhətlər:
Xarici qovluqlarla işləyirsinizsə (məsələn, istifadəçinin flaşına və ya şəbəkə diskə) həmişə try-catch ilə səhvləri işləyin.
İstifadəçinin daxil etdiyi yollara birbaşa etibar etməyin.
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"Qovluğu yaratmaq mümkün olmadı: {ex.Message}");
}
Qovluğu silərkən başqa proses tərəfindən istifadə olunursa
Əgər kimsə (və ya sizin proqram) qovluqdakı faylı açıb saxlayırsa, qovluğu silməyə çalışanda IOException alacaqsınız — "silmək mümkün deyil, qovluq istifadə olunur". Əvvəlcə qovluqdakı bütün faylları bağlayın.
Qovluq boş deyil, amma siz recursive: true-i unutmusunuz
Çox yayılmış problem. Əgər recursive: true-i verməsəniz və qovluq boş deyilsə — istisna alacaqsınız.
Kritik əməliyyatlar üçün tam yollar istifadə edin
Nisbi yollarla işləmək ("Reports") həmişə tətbiqin cari iş qovluğuna görə aparılır. Əgər proqram başqa yerdən işə salınsa, qovluq gözlədiyiniz yerdə yaranmaya bilər. Kodu haradan işə salındığını yoxlayın və ya birbaşa tam yol göstərin:
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
GO TO FULL VERSION